найти команду в скрипте bash, в результате чего ошибка" Нет такого файла или каталога " только для каталогов?

2014-03-21 обновление

так что я понял, что я не так эффективен, как мог бы быть, так как все диски, которые мне нужно было "очистить", были под /media и именем "disk1, disk2,disk3, etc.- Вот последний сценарий:--31-->

DIRTY_DIR="/media/disk*" 
find $DIRTY_DIR -depth -type d -name .AppleDouble -exec rm -rf {} ;
find $DIRTY_DIR -depth -type d -name .AppleDB -exec rm -rf {} ;
find $DIRTY_DIR -depth -type d -name .AppleDesktop -exec rm -rf {} ;
find $DIRTY_DIR -type f -name ".*DS_Store" -exec rm -f {} ;
find $DIRTY_DIR -type f -name ".Thumbs.db" -exec rm -f {} ; #  I know, I know, this is a Windows file.

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

Спасибо за помощь!

обновление

прежде чем я включил полезные предложения, предоставленные всеми, я выполнил некоторые тесты, результаты которых были очень интересными (см. ниже).

в качестве теста я запустил эту команду:

root@doi:~# find /media/disk3 -type d -name .AppleDouble -exec echo rm -rf {} ;

результаты (это то, что я ожидал):

rm -rf /media/disk3/Videos/Chorus/.AppleDouble

, когда я запустил команду (без echo):

root@doi:~# find /media/disk3 -type d -name .AppleDouble -exec rm -rf {} ;

я получил тот же вывод "ошибка":

find: `/media/disk3/Videos/Chorus/.AppleDouble': No such file or directory

я поставил "error" в кавычки, потому что, очевидно, папка была удалена, как это было проверено сразу после запуска:

root@doi:~# find /media/disk3 -type d -name .AppleDouble -exec rm -rf {} ;
root@doi:~# 

кажется find команда сохранила исходные результаты, действовала на нем, удалив каталог, но затем попыталась удалить его снова? Или это на rm, который должен быть для игнорирования несуществующих файлов и аргументов, является игнорируется? Я отмечаю, что когда я запускаю тесты с rm команда в одиночку без find команда, все работало так, как ожидалось. Таким образом, непосредственно работает rm -rf ... nonexistent_directory, ошибки не были возвращены, даже если "non_existent_directory" не было там, и непосредственно работает rm -r nonexistent_directory при условии, что ожидаемые:

rm: cannot remove 'non_existent_directory': No such file or directory

должен ли я использовать вместо ? Я хотел сделать сценарий максимально широко применимым для систем, которые не имели на find.

наконец, я не предполагаю, что это имеет значение, если /media/disk1, /media/disk2, ... объединяются в файловую систему AUFS под /media/storage как find команда работает на отдельных дисках? Спасибо за помощь, ребята. Я опубликую сценарий, когда закончу.

ОРИГИНАЛЬНЫЙ ПОСТ

я пишу сценарий bash, чтобы удалить несколько остатков OS X на моих файловых ресурсах Lubuntu. Однако, при выполнении это:

...
BASE_DIR="/media/disk" # I have 4 disks: disk1, disk2, ...   
COUNTER=1

while [ $COUNTER -lt 5 ]; do      # Iterate through disk1, disk2, ...
   DIRTY_DIR=${BASE_DIR}$COUNTER     # Look under the current disk counter /media/disk1, /media/disk2, ...
   find $DIRTY_DIR -name .AppleDouble -exec rm -rf {} ;    # Delete all .AppleDouble directories
   find $DIRTY_DIR -name ".*DS_Store" -exec rm -rf {} ;     # Delete all .DS_Store and ._.DS_Store files
   COUNTER=$(($COUNTER+1))
done
...

я вижу следующий выход:

найти: '/ media / disk1 / Pictures/.AppleDouble': нет такого файла или каталога

прежде чем я добавил " - exec rm ..."часть скрипта найдена в /media / disk1/Pictures/.Каталог appledouble все. Скрипт работает правильно для удаления файлов DS_Store, но что мне не хватает для команды find для каталогов?

я боюсь слишком много трахаться с частью-exec, поскольку я не хочу уничтожать каталоги по ошибке.

2 ответов


вам не нужно избегать точки в оболочке glob, так как это не регулярное выражение. Так что используйте .AppleDouble вместо \.AppleDouble:

find $DIRTY_DIR -name .AppleDouble -exec rm -rf '{}' \;

PS: я нигде не вижу $COUNTER увеличивается в вашем скрипте.


tl; dr-Pass -prune Если вы удаляете каталоги с помощью find.

для всех, кто натыкается на этот вопрос. Запустив пример такой

find /media/disk3 -type d -name .AppleDouble -exec rm -rf {} \;

приводит к ошибке, как

rm: cannot remove 'non_existent_directory': No such file or directory

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

вы можете либо передать -maxdepth 0 или -prune чтобы предотвратить эту проблему. Вот так:

find /media/disk3 -type d -name .AppleDouble -prune -exec rm -rf {} \;

теперь он удаляет каталоги без каких-либо ошибок. Ура! :)