Intereting Posts
Как перечислять только имена файлов одного и того же типа в каталоге? Korn / Bash Shell: Как мне конвертировать содержимое в приведенный ниже формат? Установленный диск исчезает и больше не является действительным устройством LUKS Мой texinfo не указан в информации Fedora 26: обновление dnf не работает за прокси – не удалось синхронизировать кеш для репо-обновлений ' Открыть сеанс GNOME удаленно через SSH Как я могу заменить многострочную строку с помощью sed? Отключение питания USB-порта. Или отключите питание всей подсистемы USB Стирание двухстрочного шаблона с sed / grep / whatever Простое LiveCD работает только на сервере Xorg Как я могу определить диапазон внутри столбца при создании файла awk? SSH ProxyCommand один хост для достижения другого Ошибка командной строки Linux sudo не зависит от локали Перенаправить консоль на последовательный порт Как включить пользователя nagios, созданного yum, для использования check_by_ssh

Найти из списка файлов и перейти в Unix

У меня есть файл списка с именами файлов, я хочу прочитать одно имя файла из списка за раз и найти его в структуре каталогов с несколькими подпапками, а затем, найдя его, переместить в папку diff.

Пример:

listfile.txt Content of the file-- filename1.txt filename2.txt maindir |--subdir1 |---subdir2/filename1.txt |---subdir3/filename2.txt 

читать имена файлов из listfile.txt по одному и перемещать их в папку diff, скажем / destfolder.

Любое предложение было бы здорово.

Спасибо кавин

Используя цикл оболочки и вызывая find один раз для каждого имени файла:

 mkdir -p archive_dir while IFS= read -r filename; do find maindir -type f -name "$filename" -exec mv {} archive_dir ';' done  

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

Если вы используете GNU find , вы можете добавить -quit в самый конец команды find чтобы остановить процесс find после перемещения первого файла.

Показываю это работает:

 $ cat listfile.txt filename1.txt filename2.txt 
 . |-- listfile.txt `-- maindir |-- subdir1 |-- subdir2 | `-- filename1.txt `-- subdir3 `-- filename2.txt 4 directories, 3 files 

(работает вышеуказанный цикл)

Затем:

 . |-- archive_dir | |-- filename1.txt | `-- filename2.txt |-- listfile.txt `-- maindir |-- subdir1 |-- subdir2 `-- subdir3 5 directories, 3 files 

Связанные с:

  • Понимание опции -exec `find`