Назад | Перейти на главную страницу

поиск файлов на основе текстового файла, содержащего список файлов

У меня есть текстовый файл, содержащий только имена файлов (он не содержит их пути). Мне нужно найти эти файлы, которые могут находиться в любой из подпапок, а затем скопировать или переместить их в другое место. Чтобы найти файлы, которые я пробовал

  1. cat 1.txt | xargs find -iname

  2. xargs find -iname <1.txt

  3. xargs -a 1.txt найти -iname

но они возвращают "find: пути должны предшествовать выражению: KUMARI_BRACK.jpg Использование: find [-H] [-L] [-P] [-Olevel] [-D help | tree | search | stat | rates | opt | exec]" [путь ...] [выражение] ".

Любое предложение приветствуется

Более грубый подход может быть

find | egrep -f 1.txt

который будет использовать содержимое файла 1.txt как набор регулярных выражений для сопоставления. Поскольку у вас якобы нет никаких специальных символов регулярного выражения в ваших именах файлов (кроме, возможно, «.»), Это, в конечном итоге, будет соответствовать любым путям, которые генерирует find в списке имен файлов.

Однако это будет медленным, в зависимости от того, сколько файлов у вас в 1.txt.

Лучшим подходом может быть просмотр имен файлов, и если есть какие-то общие характеристики, которые можно почерпнуть (например, все они начинаются одинаково или имеют похожие суффиксы), вы можете использовать эти элементы для улучшения (подробнее ограничено) найти. Например, если все файлы имеют расширение .txt, принадлежат пользователю foo и будут найдены только в / tmp, тогда

find /tmp -type f -user foo -name \*.txt 

будет более эффективным, а также позволит вам использовать аргументы -exec, чтобы найти что-то с ними, при условии, что вы получили только те совпадения, которые вам нужны.

find /tmp -type f -user foo -name \*.txt -exec mv {} /newdir \;
cat 1.txt | xargs -L 1 find /pathname -iname 

должно помочь. Однако это не очень эффективно - снова вызывать find для каждого файла в списке.

У вас неверные параметры "поиска". Первый аргумент после «найти» - это отправная точка для поиска. Итак, что-то вроде:

cat 1.txt |xargs find /path/to/files -iname

должно сработать. Если вы ищите по всему диску, то "find / -iname". Если вы ищете из текущего рабочего каталога, то "find. -Iname".

Это жестоко и неэффективно, но у меня работает (в bash):

for file in `cat 1.txt` ; do find . -iname $file -print ; done

Если ты только хочешь найти плоские файлы (т.е. не каталоги, специальные файлы и т. д.), которые соответствуют имени, измените . -iname к . -type f -iname .

$cat list
FILE1
FILE2


$ cat list | tr -s '\n' '#' | sed -e 's/#/$\|\//g' | sed -e 's#|/$##'  |awk '{print "(/"$0")"}'
(/FILE1$|/FILE2$)

Это выше будет генерировать аргумент для egrep ниже, который за один проход отфильтрует необходимые совпадения

$ find /tmp/ | egrep '(/FILE1$|/FILE2$)'
/tmp/test/FILE2
/tmp/test/FILE1