我正在嘗試編寫一個 shell 腳本來查找特定檔案並將其移動到資料夾中。
#!/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
)