すべての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
ループのコマンドにもいくつかの変更がありました。ターゲット名は、ファイルのデフォルト名のスペースのみを削除します。それ以外の場合はファイルにアクセスできません。