2012-01-17 13 views
2

以下のスクリプトは、このエラーを与える:bashの - (その内容を含む)ディレクトリのリストを削除

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` 

私はNUMの引数を(受け入れるようにスクリプトをしたいと思います(スクリプト内で渡された番号 - 数値の高いディレクトリ名で降順に並べ替える)を除くすべてのディレクトリ(そのファイルを含む)を削除します。

すなわち/ mydirec /はこれらのDIRECの名前が含まれている場合:

53 
92 
8 
152 
77 

とスクリプトが同じように呼び出されます。bashのdel.sh 2

を、次に/ mydirec /すべきことは、それらを削除するよう(これらdirecsが含まれています降順で上位2ではありません)。

152 
92 

誰かが構文を助けてくれますか?

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

をしかし、lsの出力を解析することではないことをお勧めです:

答えて

4
#!/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 
5

をお読みください。代わりに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 - 
+0

このfindコマンドは、ディレクトリ*と**のみを検出し、カレントディレクトリ '.'も検索します。 – anubhava

+0

この質問はディレクトリ名のみを要求します。あなたのもう一つのポイントは正しいです。私はそれを更新しました。 sedを使って現在のディレクトリを削除するようになりました。 –

+0

OPはlsコマンドを使ってファイルとディレクトリの両方を削除しているようですが。 – anubhava

0

をあなたは(削除しない)2つのディレクトリを残したい場合は、計算する必要がありますディレクトリの総数引数のリストをrmに渡す方が、xargsユーティリティが便利です。

#!/bin/bash 
dir="/yourdir" 
total_no=`ls | wc -l` 
keep_no=$(($total_no - $1)) 
ls | sort -nr | tail -n $keep_no | xargs rm -rf 
関連する問題