如果 bash 腳本中存在同名文件,如何移動特定資料夾?

如果 bash 腳本中存在同名文件,如何移動特定資料夾?

我正在嘗試編寫一個 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

相關內容