Я создал файл, используя:
$ ls > ls.txt
Теперь я хочу перейти в другой каталог и использовать этот файл для создания группы пустых файлов с именами из каждой строки ls.txt
.
Какой самый простой способ сделать это?
Вы можете использовать xargs
. После перехода в новый каталог,
xargs -d '\n' touch -- < path/to/ls.txt
Обратите внимание, что если в выводе ls
изначально были какие-либо каталоги, они будут созданы как простые файлы в новом месте.
Позвольте мне призвать вас сделать шаг назад.
Похоже, ваша настоящая проблема такова: «У меня есть несколько файлов в моем текущем каталоге, и я хочу создать пустые файлы с одинаковыми именами в другом каталоге».
Вы предполагали, что разумный способ сделать это – начать с сохранения результатов ls
в файл. Разумное предположение, но, конечно, не единственный способ сделать это!
Как насчет следующего?
for filename in *; do touch -- "/path/to/somewhere/else/${filename}" done
где /path/to/somewhere/else/
это каталог, в котором вы хотите создать файлы.
Этот подход прост и легок для чтения. Кроме того, он полностью устойчив к пробелам, символам новой строки и специальным символам в именах файлов. Он не ломается, если ваш профиль связал ls
с чем-то вроде ls --color
.
Недостатком является то, что если у вас действительно много файлов, то это может сделать много дополнительной работы. Но не беспокойтесь об этом, пока это действительно не станет проблемой. *
Другим недостатком является то, что если в вашем текущем каталоге нет файлов, это создаст файл с буквальным названием *
. Вы можете избежать этого, написав shopt -s nullglob
перед циклом.
Обратите внимание, что (как и в других решениях), если у вас есть каталог d
в вашем текущем каталоге, то в цели будет создан новый пустой файл d
. Если вы хотите избежать этого, вы можете написать:
for filename in *; do if [ -f "${filename}" ]; then touch -- "/path/to/somewhere/else/${filename}" fi done
обрабатывать только нормальные файлы.
* Если это проблема: printf '\0\n' * | (cd /path/to/somewhere/else; xargs -0 touch --)
printf '\0\n' * | (cd /path/to/somewhere/else; xargs -0 touch --)
.
sed "s/\(.*\)/touch '\1'/" < ls.txt | sh
это превращает файл в сценарий оболочки, который создает файлы с помощью touch
, и записывает этот сценарий в сеанс оболочки. Запустите эту команду из папки, где вы хотите файлы. Замените ls.txt
на полное имя, если оно находится в другой папке.
OFS=$IFS; IFS=$'\n'; cd to_new_location; for file in `cat /path/to/ls.txt`; do touch $file; done; IFS=$OFS;