find
コマンドは、ワイルドカード (またはより複雑な) ファイル名の一致に対して操作を実行する単純なケースで非常に簡潔に使用できます。以下のテクニックはメモリにコミットできます...ほとんど!
これは find
を許可することで機能します コマンドは、見つけたファイル名ごとに別のコマンドを実行します。 echo
を使用して、この例をドライランできます。 mv
の代わりに/前に .
'report' で始まる名前の現在のディレクトリ内のすべてのファイルを、'reports' という名前の別の並列ディレクトリに移動したい場合:
find . -name "report*.*" -exec mv '{}' ../reports/ \;
ワイルドカード文字列は引用符で囲む必要があり、「見つかった」ファイル名を示す {} は引用符で囲む必要があり、最後のセミコロンはエスケープする必要があります。これはすべて、これらの文字の Bash/shell 処理によるものです。
find
の man ページを見てください。 その他の用途:https://linux.die.net/man/1/find
ワイルドカードがどのように機能するかについて少し話しましょう。
cp *.txt foo
実際には cp
を呼び出しません 引数 *.txt
付き 、そのグロブに一致するファイルが存在する場合。代わりに、次のように実行します:
cp a.txt b.txt c.txt foo
同様に、
mv *.txt *.old
...何をすればよいか分からない可能性があります。なぜなら、呼び出されたときに次の情報が表示されるからです:
mv a.txt b.txt c.txt *.old
または、さらに悪いことに、すでに 持っている z.old
という名前のファイル 、表示されます:
mv a.txt b.txt c.txt z.old
したがって、さまざまなツールを使用する必要があります。考慮事項:
# REPLACES: mv /data/*/Sample_*/logs/*_Data_time.err /data/*/Sample_*/logs/*_Data_time_orig.err
for f in /data/*/Sample_*/logs/*_Data_time.err; do
mv "$f" "${f%_Data_time.err}_Data_time_orig.err"
done
# REPLACES: cp /data/*/Sample_*/scripts/*.sh /data/*/Sample_*/scripts/*_orig.sh
for f in /data/*/Sample_*/scripts/*.sh; do
cp "$f" "${f%.sh}_orig.sh"
done
# REPLACES: sh /data/*/Sample_*/scripts/*_orig.sh
for f in /data/*/Sample_*/scripts/*_orig.sh; do
if [[ -e "$f" ]]; then
# honor the script's shebang and let it choose an interpreter to use
"$f"
else
# script is not executable, assume POSIX sh (not bash, ksh, etc)
sh "$f"
fi
done
これは、パラメーター拡張を使用して、新しい名前を追加する前に古い名前の末尾を取り除きます。