シェルスクリプトを使用してLinuxですべてのファイル名のスペースをアンダースコアにする方法は?

シェルスクリプトを使用してLinuxですべてのファイル名のスペースをアンダースコアにする方法は?

すべてのXMLファイル名のスペースを変更する必要がある次のシェルスクリプトを試しました。

for xml_file in $(find $1 -name "* .xml" -type f);
do
 echo "removing spaces from XML file:" $xml_file
 mv "$xml_file" "${xml_file// /_}";
done

xmlファイルがあると仮定すると、xy z.xml次の結果が表示されます。

removing spaces from XML file: /home/krishna/test/xy
mv: cannot stat `/home/krishna/test/xy': No such file or directory
removing spaces from XML file: .xml
mv: cannot stat `z.xml': No such file or directory

答え1

以下と組み合わせて使用​​してくださいbash

find $1 -name "* *.xml" -type f -print0 | \
  while read -d $'\0' f; do mv -v "$f" "${f// /_}"; done

find名前にスペースが含まれているファイルが検索されます。ファイル名は、-print0特殊ファイル名を処理するための区切り文字としてNULLバイト()を使用して印刷されます。その後、組み込み関数はreadヌルバイトで区切られたファイル名を読み取り、最後にスペースをアンダースコアにmv置き換えます。

編集する:ディレクトリからスペースを削除するにはもう少し複雑です。ディレクトリの名前が変更されると、find名前の参照を介してアクセスできなくなります。この試み:

find -name "* *" -print0 | sort -rz | \
  while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done

sort -rzフォルダの最も深いファイルが最初に移動され、フォルダ自体が最後に移動されるようにファイルの順序を逆にします。したがって、フォルダ内のすべてのファイルとフォルダ名が変更されるまで、フォルダ名は変更されません。mvループのコマンドにもいくつかの変更がありました。ターゲット名は、ファイルのデフォルト名のスペースのみを削除します。それ以外の場合はファイルにアクセスできません。

答え2

  1. 使用rename

    find . -type f -name "* *.xml" -exec rename "s/\s/_/g" {} \;
    

    または$1

    find "$1" -type f -name "* *.xml" -exec rename "s/\s/_/g" {} \;
    
  2. 使用mv

    find . -type f -name "* *.xml" -exec bash -c 'mv "$0" "${0// /_}"' {} \;
    

    または$1

    find "$1" -type f -name "* *.xml" -exec bash -c 'mv "$0" "${0// /_}"' {} \;
    

答え3

同じ問題が発生したときに見つけたものは次のとおりです。

for f in *; do mv "$f" `echo $f | tr ' ' '_'`; done

SSL証明書を自動的に更新するためのbashスクリプトファイルを作成しています。

答え4

使用rename:

rename 's/\s/_/g' ./*.xml

不要find:)

関連情報