特定のディレクトリの特殊文字を確認し、そのファイルを特定のディレクトリに移動するスクリプトのループを作成しようとしています(スペースとハイフンを除く)。これらは下線で置き換えられ、対応するディレクトリに残ります。これを得ました。スクリプトが完了しました)。こことStack Overflowで見つけたいくつかの可能性を調べた結果、かなりよく一致しますが、そのどれも好きなように動作させることはできません。
for i in /home/*; do
case $i in
*\?*||*\**||*\$*||*\%*||*\.*||*\'*||*\"*||*\**||*\,* )
mv home/failed;
esac
done
これを行うより短い方法またはより良い方法がある場合は、必ずしもこれである必要はありません。
よろしくお願いします。あなたは本当に素晴らしいです! IT学士が教えてくれたより、Stack Overflow、U&Lなどのサイトでより実用的な情報を学びました。
答え1
ここで注目すべき点は、Unixファイル名には '/'と '\ 0'を除くすべての8ビット文字値を持つ文字を含めることができることです。
[AZ]、[az]、またはアンダースコア以外の文字を含むファイルを移動するには、次のコマンドを使用します。
for file in /home/*; do
filename=${file##*/}
[ -n "${filename//[A-Za-z_]/}" ] && mv "$file" failed/
done
まず、ディレクトリパスを削除してファイル名だけを残すように動作します。次に、ファイル名から「正当な」文字をすべて削除します。文字が残っている場合は、ファイル名に無効な文字が含まれて移動されます。
答え2
これはスクリプトで使用するために変更できるはずですが、コマンドラインでこれを行う場合でもこれを行うことができますls -i
。これにより、ディレクトリ内の各ファイルのinodeが提供されます。ここで find を使用できます。
find ./ -i $INODE -exec mv {} <target> \;