すべての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
xy z.xml
という名前の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
これをbash
で使用します。
find $1 -name "* *.xml" -type f -print0 | \
while read -d $'\0' f; do mv -v "$f" "${f// /_}"; done
find
は、名前にスペースが含まれるファイルを検索します。ファイル名はnullbyte(-print0
)デリミタとして使用し、特別なファイル名にも対応します。次に、read
ビルトインがnullバイトで区切られたファイル名を読み取り、最後にmv
がスペースをアンダースコアに置き換えます。
編集:ディレクトリのスペースも削除したい場合は、もう少し複雑です。ディレクトリの名前が変更され、find
が検出した名前でアクセスできなくなります。これを試して:
find -name "* *" -print0 | sort -rz | \
while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
sort -rz
はファイルの順序を逆にします。そのため、フォルダー内の最も深いファイルが最初に移動し、フォルダー自体が最後に移動します。したがって、すべてのファイルとフォルダがその内部で名前が変更されるまで、名前が変更されるフォルダはありません。ループ内のmv
コマンドも少し変更されています。ターゲット名では、ファイルのベース名のスペースのみを削除します。そうしないと、アクセスできません。
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// /_}"' {} \;
これは、同じ問題に直面したときに見つけた方法です。
for f in *; do mv "$f" `echo $f | tr ' ' '_'`; done
私は、ssl証明書を自動的に更新するbashスクリプトファイルを作成していました。
rename
を使用:
rename 's/\s/_/g' ./*.xml
find
は必要ありません:)