Bash

如何將包含字元串的所有子文件夾移動到新目錄,包括其超級目錄

  • March 8, 2022

我一直試圖弄清楚這一點。這是我的文件的範例:

~/download/Video/CE/
~/download/Video/CE/153
~/download/Video/CE/153/2022-03-04
~/download/Video/CE/153/2022-03-05
~/download/Video/CE/281
~/download/Video/CE/281/2022-03-04
~/download/Video/CE/281/2022-03-05
~/download/Video/GA/
~/download/Video/GA/154
~/download/Video/GA/154/2022-03-04
~/download/Video/GA/154/2022-03-05
~/download/Video/GA/615
~/download/Video/GA/615/2022-03-04
~/download/Video/GA/615/2022-03-05
...etc

/download/Video 中有幾十個文件夾,/download/video/*/ 中有幾百個文件夾

我正在嘗試將所有包含“2022-03-04”的文件夾及其所有內容移動到一個新目錄中。我想要的結果是:

/mnt/d/archive/Video/CE/153/2022-03-04
/mnt/d/archive/Video/CE/281/2022-03-04
/mnt/d/archive/Video/GA/154/2022-03-04
...etc

我嘗試了各種方法,但我最大的問題是我不能簡單地將影片文件夾移動到 /mnt/d/archive,因為我想將 2022-03-05 文件夾(和超級目錄)保留在主驅動器上。

這是我迄今為止嘗試過的:

cd ~/download/Video/CE; for subdir in *; do mv $subdir/2022-03-04 /mnt/d/archive/Video/CE/$subdir/; done;

^ 然後複製並粘貼 GA 的程式碼和 /Video/ 中的所有其他子目錄

這創建了以下內容:

/mnt/d/archive/Video/CE/153/file.mp4
/mnt/d/archive/Video/CE/153/file2.mp4
/mnt/d/archive/Video/CE/281/file.mp4
...etc

這很好,除了它不複製“2022-03-04”文件夾本身。我需要 2022-03-04 文件夾。所以我嘗試了這段程式碼:

cd ~/download/Video/CE; for subdir in *; do mv $subdir/2022-03-04 ~/mnt/d/archive/Video/CE/$subdir/2022-03-04; done;

但是,現在我遇到了另一個問題。這次沒有複製任何文件夾或文件。我只是收到“沒有這樣的文件或目錄”錯誤。

有任何想法嗎?

我的選擇是 tar 因為它很快。

(cd ~/download/Video && find . -type d -name 2022-03-04 | tar -T - -cpf - --remove-files | tar -C "/mnt/d/archive/Video/" -xpf -)

如果我正確理解你的問題,這樣的事情應該可以工作:

cd ~/download/Video
for i in $(find * -type d -name '2022-03-04'); do
   mkdir -p /mnt/d/archive/Video/"$i"
   mv "$i"/* /mnt/d/archive/Video/"$i" && rm -r "$i"
done

這將:

  1. 查找所有名為“2022-03-04”的目錄。
  2. 根據需要在存檔位置重新創建目錄樹。
  3. 將‘2022-03-04’的內容移動到對應的歸檔目錄下,去掉原來的‘2022-03-04’目錄。

(標準免責聲明,如果文件名有奇怪的字元,這將中斷)

引用自:https://unix.stackexchange.com/questions/693193