Не то чтобы я об этом знал ... но вы могли бы просто выполнить mkdir -p / path / to / make && touch / path / to / file ... Что бы создать пустой файл в той новой структуре каталогов, которую вы создали, по мере необходимости.
1
@Kansha объединить это с dirnameи basenameи нам нужен только один аргумент; прибыль! :)
Да, хороший звонок.
Ответы:
29
Установка сделает это, если дан исходный файл /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 0Jan3010:31/tmp/a/b/c
Не уверен, что это ошибка или нет - ее поведение с файлами устройств не упоминается на странице руководства. Вы также можете просто дать ему пустой файл (например, недавно созданный с mktemp) в качестве источника.
testНе требуется; mkdir -pничего не делает, если каталог уже существует. Даже не возвращает ошибку.
Дероберт
1
И, конечно, это только создает каталог.
CVn
0
Я собирался предложить, поскольку он хранит его в одной строке, хотя установка переменной отдельно позволяет вам изменить ее и довольно легко перезапустить команду из истории.
Роб Гриффитс опубликовал в 2007 году статью под названием « Легко создавать много новых папок» на Macworld.com, в которой он обсуждал использование xargsкоманды для чтения списка файлов для создания каталогов с помощью mkdir.
xargsспособен ссылаться на placeholder( {}) с -Iфлагом, который содержит значение для каждого передаваемого аргумента xargs. Вот разница между этим флагом и без него:
Эта команда в основном отображает каждое имя файла в списке файлов, разделенных строками, отсекает файловую часть, создает каталоги mkdir -pи затем touchуказывает имя файла в соответствующем каталоге.
Вот разбивка того, что происходит в приведенной выше команде:
cat files.txt производит deeply/nested/foo/bar.jsdeeply/nested/baz/fiz.txt
deeply/nested/foo/bar.jsdeeply/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:
У вас есть все это объяснение того, что по существу cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"', которое имеет UUOC, затем вы подразделяетесь на xargs, который подоболочки возвращается в оболочку, когда while readцикл имеет больше смысла
Стивен Пенни,
1
Признаюсь, я не особо разбираюсь в командах * nix - я даже не знаю, что такое UUOC - но я не понимаю, как это ужасный ответ. Он исследован, проверен и является рабочим решением вашего первоначального вопроса. Это конструктивно (в отличие от вашего довольно грубого комментария). Пожалуйста, если вы чувствуете, что я сделал здесь что-то безответственное, чего не должен был делать, то уточните дальше - объясните почему . Меня не волнует самоуверенная дискуссия, которая не имеет смысла.
Бритобород
1
Мой последний комментарий объясняет это прекрасно. Весь ваш ответ может быть лучше написано как while read f; do mkdir -p "$(dirname "$f")"; touch "$f"; done < files.txt. Тот факт, что вы не можете сделать 10-секундный поиск в Интернете для UUOC, также говорит о себе
dirname
иbasename
и нам нужен только один аргумент; прибыль! :)Ответы:
Установка сделает это, если дан исходный файл
/dev/null
.-D
Аргумент говорит , чтобы создать все родительские каталоги:Не уверен, что это ошибка или нет - ее поведение с файлами устройств не упоминается на странице руководства. Вы также можете просто дать ему пустой файл (например, недавно созданный с
mktemp
) в качестве источника.источник
Нет, это не так, насколько я знаю. Но вы всегда можете использовать
mkdir -p
иtouch
после друг друга:источник
Я часто сталкивался с такой ситуацией, поэтому я просто написал функцию в своем
.bashrc
файле. Это выглядит такИтак, когда я хочу создать файл внутри пути несуществующих каталогов, я скажу
источник
touchp
, какmkdir -p
источник
test
Не требуется;mkdir -p
ничего не делает, если каталог уже существует. Даже не возвращает ошибку.Я собирался предложить, поскольку он хранит его в одной строке, хотя установка переменной отдельно позволяет вам изменить ее и довольно легко перезапустить команду из истории.
источник
Можно «подделать».
Во-первых, некоторые необходимые теории:
Роб Гриффитс опубликовал в 2007 году статью под названием « Легко создавать много новых папок» на Macworld.com, в которой он обсуждал использование
xargs
команды для чтения списка файлов для создания каталогов с помощьюmkdir
.xargs
способен ссылаться наplaceholder
({}
) с-I
флагом, который содержит значение для каждого передаваемого аргументаxargs
. Вот разница между этим флагом и без него:xargs
также может запускать произвольные команды оболочки сsh -c
флагом:Объединяя понятия:
Мы можем объединить эти понятия с
mkdir -p
вместоmkdir
и понятия в @ldx «s ответа произвести это:Эта команда в основном отображает каждое имя файла в списке файлов, разделенных строками, отсекает файловую часть, создает каталоги
mkdir -p
и затемtouch
указывает имя файла в соответствующем каталоге.Вот разбивка того, что происходит в приведенной выше команде:
Скажем, например, моя
files.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, также говорит о себе