特定のファイルを見つけてフォルダーに移動するシェル スクリプトを作成しようとしています。
#!/bin/sh
echo -n "/home/cosmoretro/movie/"
read text2
while :
do
echo -n "Ara:"
read text1
b=$(find /home/cosmoretro 2>/dev/null -iname "$text1"*)
IFS=$'\n'
mv $b /home/cosmoretro/movie/"$text2"
done
ただし、検索したフォルダーと同じファイルがある場合は、ファイルも移動されます。
必要なのはフォルダの移動だけです。
答え1
このスクリプトを読むのも大変です。少し書き直した方が良いでしょうか?
#!/bin/sh
echo -n "/home/cosmoretro/movie/"
read destinationFileName
while :
do
echo -n "Ara:"
read sourceFileName
sourceFile=$(find /home/cosmoretro -type d -iname "$sourceFileName" -print -quit 2> /dev/null)
if [[ -z $sourceFile ]]; then
echo "No file named $sourceFileName found"
else
mv -- "$sourceFile" /home/cosmoretro/movie/"$destinationFileName"
fi
done
私がやったこと:
destinationFileName
代わりに、次のような説明的な名前を使用してください。text2
- 適切にインデントする
find
を指定してディレクトリのみを検索するようにします-type d
。ファイルのみを移動する場合は、-type f
の代わりにを使用します-type d
。- リダイレクトは重要ではないのでコマンドの最後に移動してください
find
最初のファイルが見つかったら停止します(-quit
)*
コマンド内の余分な部分を削除してくださいfind
。そこに何が必要なのかわかりません。ファイル名にワイルドカードを含めるつもりなら(例えば、を検索するとfoo
が返されますfoobar
)、ワイルドカードを挿入する必要があります。の中へ引用符、つまり"$sourceFileName*"
。-z
結果が空かどうかをテストして、ファイルが見つかったかどうかを確認します。- オプションの終了オプションを使用して、
mv
ファイル名がで始まることを防ぎます。-
--
- 空白文字がコマンドを中断するのを防ぐために引数を適切に引用符で囲みます(変更する必要はありません
IFS
)