Intereting Posts
Настроить Ubuntu, чтобы он всегда начинался с открытия терминала и Xload? Служба mariadb не запускается после загрузки, CentOS 7 Нужен скрипт, который генерирует файлы из слов в одном текстовом файле Mail forward: 550 5.7.1 У анонимного клиента нет разрешений на отправку в качестве этого отправителя Как повторить команду с добавленным параметром Как разблокировать файловую систему только для чтения на дистрибутиве Linux OpenWRT? обновлен до Ubuntu 13.04 Server, до-релиз-обновление все еще показывает Как перезагрузить фоновый процесс? Прокрутка собственного init: как завершить / перезапустить? как восстановить базу данных mysql из полной резервной копии базы данных Обновление Redhat с помощью командной строки Конец сеанса, если команда выхода выполняется параллельно с другой командой Перечислить пакеты в системе на основе apt по дате установки Как работает обнаружение sudo / root-ness Как разбить CSV-файл на начальный столбец (с заголовками)?

find -exec mv останавливается после первого запуска

Изучая этот вопрос: найдите и переместите каталоги на основе типа файла и даты , я наткнулся на свою проблему.

Сначала я создал кучу каталогов с файлами в них:

seq 10 | while read dir; do mkdir dir$dir touch dir$dir/file.txt seq 5 | while read file; do touch dir$dir/file${dir}_$file done done 

Затем я попытался выполнить команду find:

 $ find -type f -name "*.txt" ./dir6/file.txt ./dir8/file.txt ./dir10/file.txt ... 

Работает так, как ожидалось.

Теперь с помощью -exec :

 $ find -type f -name "*.txt" -exec sh -c 'echo mv -v "${0%/*}" ../bar' {} \; mv -v ./dir6 ../bar mv -v ./dir8 ../bar mv -v ./dir10 ../bar ... 

Работает так, как ожидалось.

Теперь фактическая команда:

 $ find -type f -name "*.txt" -exec sh -c 'mv -v "${0%/*}" ../bar' {} \; `./dir6' -> `../bar/dir6' 

Он останавливается после первого mv . Нет сообщения об ошибке. Статус выхода равен 0. bar каталога существует, и dir6 перемещается правильно.

Когда я повторяю это, это происходит:

 $ find -type f -name "*.txt" -exec sh -c 'mv -v "${0%/*}" ../bar' {} \; `./dir8' -> `../bar/dir8' 

Опять остановитесь после первого mv . Состояние выхода – 0. dir8 перемещается правильно.

Почему find останавливается после первого mv ? Поскольку каталог перемещен и find запутан? Почему он не печатает ошибку или не возвращает статус выхода из системы?

Когда я создаю больше каталогов и больше файлов, он имеет такое же поведение.

В связанном выше вопросе проблема заключается в том, что find выполняется один раз без проблем, но ошибки печати для всех совпадений после этого. Связано ли это?

Использование find (GNU findutils) 4.4.2 .

В:

 find -type f -name "*.txt" -exec sh -c 'mv -v "${0%/*}" ../bar' {} \; 

find открывает текущий каталог ( . ), получает контент ( list1 ). Затем перерабатывается этот список. Он обрабатывает dir6 ; поскольку этот файл является каталогом, он chdirs в него, открывает его, получает второй список файлов ( list2 ), обрабатывает file.txt и делает:

 mv -v ./dir6 ../bar 

Теперь текущий каталог find не изменился, но его путь изменился: теперь это ../bar/dir6 . После завершения перемещения содержимого dir6 он возвращается ( chdir("..") ) и теперь находится в ../bar . find обнаруживает, что каталог не совпадает с предыдущим и завершает работу .