Как найти много файлов из txt файла в каталоге и подкаталогах, а затем скопировать все в новую папку - PullRequest
0 голосов
/ 01 мая 2018

Я не могу найти сообщения, которые помогут решить эту проблему:

В Mac Terminal я хочу прочитать текстовый файл (example.txt), содержащий имена файлов, такие как: 20130815 144129 865 000000 0172 0780.bmp 20130815 144221 511 000003 1068 0408.bmp .... еще 100

И я хочу искать их в определенной папке / подпапках (example_folder). После каждого поиска файл должен быть скопирован в новую папку x (new_destination).

Ваша помощь будет высоко ценится!

Chers, Mo

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Вы можете сделать что-то вроде:

$ for i in `cat example.txt`
find /search/path -type f -name "$i" -exec cp "{}" /new/path \;

Вот как это работает, для каждой строки в example.txt:

for i in `cat example.txt`

попытается найти файл, соответствующий строке $i по указанному пути:

find /search/path -type f -name "$i"

И если он будет найден, он скопирует его в нужное место:

-exec cp "{}" /new/path \;
0 голосов
/ 01 мая 2018

Вы можете использовать переданную по команде команду с комбинацией ls, grep, xargs и cp.

Итак, вы начинаете с получения списка файлов

ls

затем вы фильтруете их с помощью egrep -e, grep -e или любой другой разновидности grep Mac, используемой для их терминала. Если вы хотите найти все файлы, заканчивающиеся текстом, вы можете использовать регулярное выражение .txt$ (что означает «.txt»)

ls | egrep -e "yourRegexExpression" 

После этого вы получаете входной поток, но cp не работает с входными потоками и принимает только несколько аргументов, поэтому мы используем xargs для преобразования его в аргументы. Последний шаг - добавить флаг -t к аргументу, чтобы указать, что следующим аргументом является целевой каталог.

ls | egrep -e "yourRegexExpression" | xargs cp -t DIRECTORY

Надеюсь, это поможет!

Редактировать

Извините, я не прочитал вопрос достаточно хорошо, я обновился, чтобы соответствовать вашей проблеме. Здесь вы можете видеть, что команда egrep компилирует довольно большую строку регулярного выражения со всеми именами файлов таким образом (filename1|filename2|...|fileN). $ () Оценивает команду внутри и использует tr для перевода newLines в "|" для регулярного выражения.

ls | egrep -e "("$(cat yourtextfile.txt | tr "\n" "|")")" | xargs cp -t DIRECTORY

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...