найти команду в скрипте 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 {} \;
теперь он удаляет каталоги без каких-либо ошибок. Ура! :)