Создать файлы из списка текстовых файлов

Я создал файл, используя:

$ 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;