次の例のように、Bash でファイル名のプレフィックスを削除するにはどうすればよいですか。
XY TD-11212239.pdf
取得するため
11212239.pdf
つまり、削除しXY TD-
ますか?
あなたは、BASH、Kornshell、Ash、Zsh、および Dash を含むPOSIXシェルと言いました。幸いなことに、これらのシェルはすべて、変数値に対してパターン フィルタリングを行います。
*
パターンは、Unix/Linux コマンド ラインなどでファイルを指定するときに使用するものです。
$ ls *.sh # Lists all files with a `.sh` suffix
これらの POSIX シェルは、次の 4 つの異なるパターン フィルタリングを使用します。
${var#pattern}
- パターンに一致する左側から最小の文字列を削除します。${var##pattern}
- パターンに一致する左側から最大の文字列を削除します。${var%pattern}
- パターンに一致する右側から最小の文字列を削除します。${var%%pattern}
- パターンに一致する右側から最大の文字列を削除します。以下にいくつかの例を示します。
foo="foo-bar-foobar"
echo ${foo#*-} # echoes 'bar-foobar' (Removes 'foo-' because that matches '*-')
echo ${foo##*-} # echoes 'foobar' (Removes 'foo-bar-')
echo ${foo%-*} # echoes 'foo-bar'
echo ${foo%%-*} # echoes 'foo'
何をしたいのかを実際に説明しておらず、コード例も含めていないため、希望どおりに動作するものを思いつくのは困難です. ただし、パターン フィルタリングを使用すると、ファイル名をどうしたいかを正確に把握できる可能性があります。
file_name="XY TD-11212239.pdf"
mv "$file_name" "${file_name#*-}" # Removes everything from up to the first dash
$ s='XY TD-11212239.pdf'
$ echo "${s#XY TD-}"
11212239.pdf
目的が一括名前変更の実行である場合:
while IFS= read -r -d '' filename; do
mv "$filename" "${filename#XY TD-}"
done < <(find . -type f -name 'XY TD-*' -print0)
<()
POSIX sh には存在しない bash 拡張機能であることに注意してください。形式のパイプラインに置き換えることができますfind ... | while
。
同様に、-print0
POSIX find には存在しない GNU 拡張機能です。POSIX find は、改行を含む名前に対して安全なファイルを見つけるための同等の方法を提供しないため、置換が困難になります。