2016-12-05 4 views
0

У меня есть каталог, заполненный подкаталогами, превышающими 450 ГБ. Внутри этих подкаталогов находится файл инструкции в каждом подкаталоге. У меня есть скрипт, который копирует файл инструкции в каталоге я нахожусь в данный момент, и помещает его в каждом подкаталоге через:Bash скрипт для удаления файла во всех подкаталогах.

#!/bin/bash 
for d in */; do cp "INSTALLATION INSTRUCTIONS.rtf" "$d"; done 

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

#!/bin/bash 
for d in */; do rm "INSTALLATION INSTRUCTIONS.rtf" "$d"; done 

Я очень неохотно и хотел сделать иск, поскольку эти файлы являются жизненно важными, и я не хочу, чтобы случайно удалить что-нибудь и сделать резервную копию 450+ ГЗ очень облагается налогом.

+0

Эти два совершенно не похожи друг на друга. 'cp src target' копирует' src' в 'target', тогда как' rm arg1 arg2' удаляет как 'arg1', так и' arg2'. –

+0

BTW, почему вы удаляете их как отдельный шаг, а просто переписываете файл на месте? –

+0

Lol see Я так рад, что спросил. Было бы ужасно удалить и файл, и каталог. Как я могу просто удалить файл внутри всех каталогов? – Eseye

ответ

0
find . -mindepth 2 -name "INSTALLATION INSTRUCTIONS.rtf" -exec rm -f '{}' + 
+0

** Флагеры/рецензенты: ** [Для ответов только на код, например, этот, нисходящий, не удалять!] (// meta.stackoverflow.com/a/260413/ 2747593) (Но ИМХО, этот ответ достаточно прост, что ему не нужно много объяснений, поэтому он не гарантирует даже нисходящего). –

0

Поскольку это «жизненно важные» данные, я бы первый список всех файлов, которые соответствуют имя файла, который вы хотите удалить/перезаписи, без принятия каких-либо действий на нем (кроме перечисления):

find /folder/ -type f -name "INSTALLATION INSTRUCTIONS.rtf" -print > /tmp/holder 

Это создало бы список совпадений на/tmp/holder. Затем вы можете проанализировать этот список, прежде чем предпринимать какие-либо действия (визуально или программно), чтобы убедиться, что список не содержит ничего, что вы не хотите удалять (при работе с большими объемами данных могут произойти странные вещи, поэтому будьте активными по защите данных).

Если вы довольны тем, что показывает список, вы можете удалить старые инструкции или, по возможности, переписать их новым файлом. Вот пример, чтобы перезаписать старый файл с новым:

while read -r line; do cp --no-preserve=all /folder/newfile "$line"; done < /tmp/holder 

cp --no-preserve=all команда (доступна на GNU Баш) будет гарантировать, что новый файл имеет разрешения, которые являются «адекватными» в папку, где они расположены. Вы можете изменить это на простой cp, если вы этого не хотите.

+0

Если «жизненно важно» достаточно для записи на диск для обзора, это жизненно важно достаточно важны для использования потока имен с нулевым ограничением, а не с помощью строки, обозначенной символом новой строки. В конце концов, вы не захотите создать файл с именем '/ folder/$ '\ n'/etc/passwd $ '\ n'/INSTALLATION \ INSTRUCTIONS.rtf' для запуска удаления'/etc/passwd'. –

+0

Хорошая точка. Но это может быть (и должно быть) программно проверено на файле/tmp/holder и полностью предотвращено.Можно также использовать временный файл как «сухой ход», который позволяет легко визуализировать и безопасно программировать зондирование, а затем, когда довольны результатами, просто проведите первую строку кода во второй (требуется, конечно, корректировки), и эта проблема может быть избегать. –

+0

Я не согласен с тем, что «должен» (хотя он был защитником, стойко выступающим против предполагаемой морали [xkcd # 327] (https://xkcd.com/327/), делает меня, по общему признанию, странным). Зачем использовать механизм, подверженный ошибкам, и сканирование содержимого, которое может вызвать ошибку, в отличие от использования механизма, который вообще не подвержен этой ошибке? Последнее проще, имеет меньшее количество ошибок, и позволяет избежать ненужных ограничений на обрабатываемые данные. –

Смежные вопросы