mkdir -p
створить каталог; він також зробить батьківські каталоги за потребою.
Чи існує аналогічна команда для файлів, яка створить файл та батьківські каталоги за потребою?
mkdir -p
створить каталог; він також зробить батьківські каталоги за потребою.
Чи існує аналогічна команда для файлів, яка створить файл та батьківські каталоги за потребою?
Відповіді:
Установка зробить це, якщо вказати вихідний файл /dev/null
. -D
Аргумент каже , щоб створити всі батьківські каталоги:
anthony@Zia:~$ install -D /dev/null /tmp/a/b/c
anthony@Zia:~$ ls -l /tmp/a/b/c
-rwxr-xr-x 1 anthony anthony 0 Jan 30 10:31 /tmp/a/b/c
Не впевнений, що це помилка чи ні - її поведінка з файлами пристрою не згадується на сторінці сторінки. Ви також можете просто дати йому порожній файл (щойно створений mktemp
, наприклад, як джерело).
Я часто стикався з подібною ситуацією, тому просто записав функцію у свій .bashrc
файл. Це виглядає приблизно так
function create() {
arg=$1
num_of_dirs=$(grep -o "/" <<< $arg | wc -l)
make_dirs=$(echo $arg | cut -d / -f1-$num_of_dirs)
mkdir -p $make_dirs && touch $arg
}
Отже, коли я хочу створити файл всередині контуру неіснуючих каталогів, я скажу
create what/is/it # will create dirs 'what' and 'is', with file 'it' inside 'is'
touchp
, якmkdir -p
Я збирався запропонувати, оскільки він зберігає його в одному рядку, хоча встановлення змінної окремо дозволяє змінити її і перезапустити команду з історії досить легко.
B="./make/this/path" && mkdir -p -- "$B" && touch -- "$B/file.txt"
Можна «підробити».
Роб Гріффітс опублікував статтю в 2007 році під назвою Легко створювати багато нових папок на Macworld.com, де він обговорював використання xargs
команди для читання у списку файлів для створення каталогів за допомогоюmkdir
.
xargs
здатний посилати placeholder
( {}
) на -I
прапор, який містить значення для кожного переданого аргументу xargs
. Ось різниця між цим прапором і без:
$ foo.txt bar.txt | xargs echo
$ => foo.txt bar.txt
$ foo.txt bar.txt | xargs -I {} echo {}
$ => foo.txt
$ => bar.txt
xargs
також здатний виконувати довільні команди оболонки з sh -c
прапором:
foo.txt bar.txt | xargs sh -c 'echo arbitrary command!'
Ми можемо об'єднати ці поняття з mkdir -p
замість mkdir
і поняття в @ldx «s відповіді зробити це:
$ cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'
Ця команда в основному відображає кожне ім'я файлу в розділеному рядком списку файлів, відсікає частину файлу, створює каталоги з, mkdir -p
а потімtouch
видає ім'я файлу у відповідній директорії.
Скажімо, наприклад, моє files.txt
виглядає так:
deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
cat files.txt
виробляє deeply/nested/foo/bar.js
deeply/nested/baz/fiz.txt
deeply/nested/foo/bar.js
deeply/nested/baz/fiz.txt
трубопровід до xargs
-I {}
, xargs
переведемо кожен аргумент у свою власну команду, тож тепер у нас є:
deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
&&
комбінатор для групування команд 3, які виконуються послідовно - перша команда зберігає файл у змінній оточення (що повторно використовується при наступному пропуску файлу), використовуючи заповнений нами місце раніше, тому ми тепер мають:
f=deeply/nested/foo/bar.txt
f=deeply/nested/baz/fiz.txt
mkdir -p
, але нам потрібно вирізати ім’я файлу. Досить просто за допомогою '${f%/*}'
:
mkdir -p deeply/nested/foo/
mkdir -p deeply/nested/baz/
f
змінну в повному обсязі, коли touch
:
touch deeply/nested/foo/bar.txt
touch deeply/nested/baz/fiz.txt
cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'
, що має UUOC, тоді ви перебуваєте в підрозділі xargs, який знаходиться в оболонці, коли while read
цикл має більше сенсу
while read f; do mkdir -p "$(dirname "$f")"; touch "$f"; done < files.txt
. Про те, що ви не можете зробити 10-секундний Інтернет-пошук для UUOC, також говорить