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.txtdeeply/nested/foo/bar.js deeply/nested/baz/fiz.txt трубопровід до xargs-I {}, xargsпереведемо кожен аргумент у свою власну команду, тож тепер у нас є:
deeply/nested/foo/bar.txtdeeply/nested/baz/fiz.txt&&комбінатор для групування команд 3, які виконуються послідовно - перша команда зберігає файл у змінній оточення (що повторно використовується при наступному пропуску файлу), використовуючи заповнений нами місце раніше, тому ми тепер мають:
f=deeply/nested/foo/bar.txtf=deeply/nested/baz/fiz.txtmkdir -p, але нам потрібно вирізати ім’я файлу. Досить просто за допомогою '${f%/*}':
mkdir -p deeply/nested/foo/mkdir -p deeply/nested/baz/fзмінну в повному обсязі, коли touch:
touch deeply/nested/foo/bar.txttouch deeply/nested/baz/fiz.txtcat 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, також говорить