bash - удалить список каталогов (включая их содержимое) - PullRequest
2 голосов
/ 17 января 2012

Сценарий ниже выдает эту ошибку:

rm: illegal option -- 4
rm: illegal option -- 5
rm: illegal option -- 4
rm: illegal option -- 3
rm: illegal option -- 2

скрипт:

#!/bin/bash
keep_no=$1+1
cd "/mydirec/"
rm -rf `ls | sort -nr | tail +$keep_no`

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

т.е. если / mydirec / содержит следующие имена директив:

53
92
8
152
77

и скрипт называется следующим образом: bash del.sh 2

, тогда / mydirec / должен содержать эти директивы (так как он удаляет те, которые не входят в топ-2 в порядке убывания):

152
92

Может кто-нибудь помочь с синтаксисом?

Ответы [ 3 ]

5 голосов
/ 17 января 2012

Следует читать:

rm -rf `ls | sort -nr | tail -n +$keep_no`

Но хорошей практикой является не анализировать вывод ls.Вместо этого используйте find.

#!/bin/bash
keep_no=$(( $1+1 ))
directory="./mydirec/"
cd $directory
rm -rf `find . -maxdepth 1 -mindepth 1 -type d -printf '%f\n'| sort -nr | tail -n +$keep_no`
cd -
4 голосов
/ 17 января 2012
#!/bin/bash
if [[ -z "$1" ]]; then 
   echo "syntax is..."
   exit 1
fi
keep_no=$(( $1 + 1 ))
cd "/mydirec/"
IFS='
';    # record separator: only enter inside single quotes
echo rm -rf $(ls | sort -nr | tail +$keep_no)

Проверьте вывод скрипта вручную , затем выполните скрипт через sh:

./your_script.sh | sh -x
0 голосов
/ 17 января 2012

Если вы хотите оставить две директории (не удалять), вам нужно рассчитать общее количество каталогов.А утилита xargs - более удобный способ передачи списка аргументов в rm.

#!/bin/bash
dir="/yourdir"
total_no=`ls | wc -l`
keep_no=$(( $total_no - $1 ))
ls | sort -nr | tail -n $keep_no | xargs rm -rf
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...