
こんにちは。すべてのファイルからスラッシュをすべて削除したいのですが、メイン ディレクトリ内のすべてのディレクトリに対してこれを再帰的に実行します。
再帰的に動作しないこのスクリプトをどのように変更する必要がありますか?
for f in "$1"/*; do
dir="$(dirname "$f")"
file="$(basename "$f")"
mv -- "$f" "${dir}/${file//[^_-0-9A-Za-z.]}"
done
または、ファイル名のスラッシュのみを置き換えたいのですが、メイン フォルダー内のすべてのサブフォルダーに対してこれを実行したいですか?
マックスに挨拶
答え1
BSD レイヤーでは、スラッシュがパス区切り文字です。スラッシュを含むファイル名に遭遇すると、カーネルはスラッシュ (-) を/
コロン (-) に変換します:
。そのため、ファインダー アプリケーションでのファイル名は のように見えますfoo/bar
が、BSD レイヤーでは のように見えますfoo:bar
。
したがって、ディレクトリ ツリーを移動するには、 を使用して、ファイル名にfind
が含まれるファイルを検索します:
。次に、 を含むインライン スクリプトを使用して、-execdir
ファイル名からコロン (Finder アプリケーションではスラッシュ) を削除します。
find . -type f -name '*:*' -execdir bash -c ' for file
do
echo mv -- "${file}" "${file//:}"
done' sh {} \;
mv
これにより、コマンドとオペランドのみがリストされます。出力で希望する結果が得られると思われる場合は、 を削除しますecho
。