2009-06-15 11 views
1

Hy、 フォルダーに多数のファイルがあり、最初にアルファベット順にソートし、特定のファイル(それを含まない)まですべてのファイルを削除するとします。Bash:特定のファイルまで削除

私は関数/ command/script/whateverを1つの文字列をimputとして取り、このファイルまですべてのファイルを削除します。

私は、単純なbashのスクリプトを考えた:

for i in *; do 
    if [ "$i" == "input" ]; then 
     break; 
    fi 
    rm "$i" 
done 

が、これは非常に長いソリューションであり、およびソートが指定されていないので、望んでいたとして、それは仕事をdoesntの。もっと短いものはありませんか?あなたは、ソートしたい場合

おかげ

+0

「*」はすでに入力を並べ替えていると言ってきました。それが本当であれば、あなたのことはそのまま動作するはずです。 –

+0

@litb - 確認済みです。 Pathname Expansionセクションのbashマンページでは、 "アルファベット順ソートリスト"というフレーズを使用していました。 –

+0

@Dennisよろしくお願いします。 –

答えて

1

これは、あなたがそれはあなたが何をしたいん確信している場合は、

rm "$line" 

Never pipe ls for processing thingsでechoコマンドを置き換える

find . -maxdepth 1 -type f | sort | 
    while read -r line && [[ $line < $i ]]; do 
     echo $line 
    done 

$i削除したまでのファイル名である)動作するようです。 lsはその作業のために作られていません。パス名の拡張やツールを findのように使用してください。

例障害場合:

$ echo > 'I have fun.mp3' 
$ cat $(ls | grep 'have fun') 
cat: I: No such file or directory 
cat: have: No such file or directory 
cat: fun.mp3: No such file or directory 

それは単語に$(...)の結果を分割し、別々の引数としてこれらの単語を通過します。したがって、rmはそのような名前を全体として見るのではなく、その言葉に分割します。

の後に単語分割が行われても、その結果にはもう影響しません。そのため、cat *はスペースを正しく処理します(またはその目的のために、IFS変数内の他の文字)。

0

は:

for i in `ls | sort` 
do 
    if [ "$i" == "input" ] 
    then 
     break 
    fi 
    rm "$i" 
done 

を確かに、これを短くすることができますが、この解決策は、おそらく最も簡単なと(通常は最も重要がある)、最も読みやすいです。そして、こののスペースを含むファイルを正しく処理します。

+1

ファイル名にスペースが含まれていると、エラーになります。私はこれが "ls | sort | read行中に修正できる"ことを知っています。コードがさらに長くなります。とにかくありがとう! – theomega

+0

ああ、私はスペースの問題を忘れていました...引用符を追加すると、(少なくとも私のマシン上では)動作します。 – Zifre

+0

*でのパス名の展開は、すでにソートされています。 "***と私は***を解析しないでください" –

2

てみてください、

rm $(ls | sort | sed '/input/,$d') 

まずここ

ls | sort | sed '/input/,$d' 

は、inputは、ファイル名をキャッチするあなたの正規表現である、などrmせずにこれを試してみてください。覚えておいてください、最初の試合後のすべてが行くでしょう!

+0

+1その解決策は、短いと読める。 – Zifre

+0

...あなたがsedを理解している場合 – Zifre

+0

sedコマンドについて説明してもらえますか? –

2
rm `ls |sed '/pattern/,$d'` 

ls出力はデフォルトでアルファベット順にソートされます。

パターンを削除して最初のファイルと一致する正規表現に置き換えます。空想的なことがない限り、patternは削除を止めるファイルの名前にすぎません。または、パターンを確実にするために "^ filename $"を使用してください。

いつものように、前にテストしてください。たとえば、開始時に "echo"を追加するだけで印刷されます。

echo rm `ls |sed '/pattern/,$d'` 
+0

lsを解析することは決してありません。http://mywiki.wooledge.org/ParsingLs –

+0

ls出力の解析に関する興味深い記事です。そのような狂ったファイル名の可能性がある場合、または信頼できない入力(ディレクトリの内容)に直面してセキュリティが必要な場合は、そのことを考慮してください。一般的に生きるための厳しいアドバイスのようです。 –

+0

'ls'を置き換えてファイルのリストを取得したい場合(' rm'のディレクトリ名をスキップしたいと思うでしょう)。 'findを使う。 - 型f 'である。 – nik

関連する問題