**rename** コマンドを使用せずにファイル名を変更する

**rename** コマンドを使用せずにファイル名を変更する

ファイルディレクトリがあります。

Measurements Panama 2009-03-22 Session1.xml
Measurements Panama 2009-03-22 Session2.xml
Measurements Panama 2009-03-22 Session3.xml
Measurements Panama 2009-03-22 Session4.xml
...
Measurements Panama 2009-03-22 Session10.xml

スペースとダッシュ文字を削除したいです-。使いたくない名前を変更するPerlや正規表現がわからないので、コマンドを使用します。ファイル名の一部を削除するための別の記事の提案は次のとおりです。

for f in *.png; do mv $f ${f#image}; done

よさそうだねその文字が何をしているのかわかりません#(ファイル名から「image」という文字列を削除するとしますか?)。とにかく空白とダッシュを削除するにはどうすればよいですか?

そのファイルがディレクトリではないと実行すると、エラーが発生します。

[jings]s0128943: for f in *.xml; do mv $f ${f//[ -]/};done

mv: target `MeasurementsPanama20090322Session10.xml' is not a directory

mv: target `MeasurementsPanama20090322Session1.xml' is not a directory

すべてのファイルを待ちます。

答え1

シェルのマニュアルページで${...}代替情報を見つけることができます。大きな打撃(1)。最も一般的な:

  • ${var#word}var最短のプレフィックスを削除する:wordプレフィックスを含む変数値(存在する場合)を削除します。

  • ${var%word}var最短のサフィックスを削除:サフィックスの変数値word(存在する場合)を削除します。

  • ${var/pattern/replacement}最初のパターンを削除

  • ${var//pattern/replacment}パターン内のすべての項目を削除します。

したがって、あなたの例では${f#image}(たとえば)値に展開し、プレフィックスを削除して値を生成します。fimage01.pngimage01.png

拡張子と部分wordは、ファイル名と同じワイルドカード拡張子を持ちます。したがって、スペースと削除するには(を使用してすべての文字と空の文字列を置き換えることができます。replacement${...}-${f//[ -]/}-

マンページのすべての詳細。

答え2

Perlがある場合rename(たとえば、DebianやUbuntuを使用しているため)、これはこの特定の猫をスキンする最も簡単な方法です(別の猫と同様に、大規模な名前変更やサイトアーカイブ検索のための多くのツールがあります)。すべての主要項目を見つける必要があります。)

rename 's/[- ]//g' *.xml

つまり、最も重要なシェルプログラミングの原則によれば、スクリプトは機能します。すべての変数置換は二重引用符で囲む必要があります。。 (このような追加の構文エラーが必要なのはなぜですか?場合によっては、実際には引用されていない動作が必要なためですが、これらのケースは非常にまれです。)

for f in *.xml; do mv "$f" "${f//[ -]/}"; done

zshを使用すると、ループを作成する必要はありません。便利なzmv機能が利用可能です。

autoload zmv
zmv '(*.xml)' '${1//[- ]/}'

答え3

sed を使用して新しい名前を作成することもできます。あります

for i in *.xml; do mv "$i" `echo "$i" | sed -e "s/[ -]//g"`; done

関連情報