スペースやパターンを含むバッチの名前変更ファイル名

スペースやパターンを含むバッチの名前変更ファイル名

一般的な形式で名前が付けられた複数のファイルの名前を変更したいと思います。

text1 text2 [firstname.lastname] text3 ... textn.ext

ファイル名からテキストを削除したいです[firstname.lastname]。作業を簡素化するには、[firstname.lastname]すべてのファイルに名前と姓が固定されているとします。

Ubuntu 12.04を使用しており、次のコマンドを試しました。

$ find . -name "*.ext" -print | xargs sed -i 's/[firstname.lastname]//g'

しかし、うまくいきません。

ベストアンサー1

Bashワイルドカードを使用してください。

for i in *.ext; do
    echo mv -nv -- "$i" "${i/firstname.lastname/}"
done

満足している場合は、エコーを削除してください。


サブディレクトリに移動する必要がある場合:

shopt -s globstar
for i in **/*.ext; do
    echo mv -nv -- "$i" "${i/firstname.lastname/}"
done

echo満足のいくものを削除してください。


使用find:

find . -name '*.ext' -exec bash -c 'echo mv -nv -- "$0" "${0/firstname.lastname/}"' {} \;

echo満足のいくものを削除してください。


名前を変更する方法はどうですか?すべての形式のパターンを削除します(したがって、ファイル名またはxxx.yyy削除します)。そのために(最初の方法を使用):firstname.lastnamejohn.doejames.brown

shopt -s extglob
for i in *.ext; do
    echo mv -nv -- "$i" "${i/+([[:graph:]])\.+([[:graph]])/}"
done

または2番目の方法を使用してください。

shopt -s globstar extglob
for i in **/*.ext; do
    echo mv -nv -- "$i" "${i/+([[:graph:]])\.+([[:graph:]])/}"
done

または、次のfind方法を使用します。

find . -name '*.ext' -exec bash -c 'shopt -s extglob; echo mv -nv -- "$0" "${0/+([[:graph:]])\.+([[:graph:]])/}"' {} \;

firstname.lastnameパターンが常にスペースの間に含まれている場合は、パターン置換を使用することもできます。

"${i/*([[:space:]])+([[:graph:]])\.+([[:graph:]])*([[:space:]])/ }"

だから一行だけ残ります。


メモ。これらの方法はすべて、スペースやその他の興味深いシンボルを含むファイル名に対して100%安全です。

おすすめ記事