すべての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
使用
rename
find . -type f -name "* *.xml" -exec rename "s/\s/_/g" {} \;
または
$1
find "$1" -type f -name "* *.xml" -exec rename "s/\s/_/g" {} \;
使用
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
:)