Bash удалить каталоги на основе содержимого - PullRequest
2 голосов
/ 22 июля 2011

В настоящее время у меня есть несколько каталогов

Directory1 Directory2 Directory3 Directory4

каждый из этих каталогов содержит файлы (файлы несколько загадочные)

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

я ищу файлы со словом .pass. в имени файла. Скажем, в Directory 4 есть тот файл, который я ищу

Direcotry4:    
file1.temp.pass.exmpl
file1.temp.exmpl
file1.tmp

, а остальные каталоги не имеют этого конкретного файла:

file.temp
file.exmp
file.tmp.other

поэтому я хотел бы удалить Directory1,2 и3, но сохранить только Directory 4 ...

Пока я придумал этот код

(arr - массив всех имен каталогов)

for x in ${arr[@]}
do
    find $x -type f ! -name "*pass*" -exec rd {} $x\;
done

другой способ, которым я думал об этом, таков:

for x in ${arr[@]}
do

    cd $x find . -type f ! -name "*Pass*" | xargs -i rd {} $x/
done

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

Есть ли способ, которым я могу это сделать? помните, я хочу, чтобы каталог 4 не изменился, все, что в нем я хочу сохранить

Ответы [ 2 ]

2 голосов
/ 22 июля 2011

Чтобы узнать, содержит ли ваш каталог файл пропуска:

if [ "" = "$(find directory -iname '*pass*' -type f |  head -n 1)" ]
  then
    echo notfound
  else
    echo found
fi

Чтобы сделать это в цикле:

for x in "${arr[@]}"
  do
      if [ "" = "$(find "$x" -iname '*pass*' -type f |  head -n 1)" ]
        then
          rm -rf "$x"
      fi
  done
1 голос
/ 22 июля 2011

Попробуйте это:

# arr is a array of all the directory names
for x in ${arr[@]}
do
ret=$(find "$x" -type f -name "*pass*" -exec echo "0" \;)
# expect zero length $ret value to remove directory
if [ -z "$ret" ]; then
    # remove dir
    rm -rf "$x"
fi
done
...