2014-09-29 73 views
3

在此先感謝您的時間和幫助。在保留文件的同時用Bash刪除文件結構中的級別

我有一個情況,我有一個DIR包含幾十個子DIR,其中所有的子DIR只包含一個文件(出於某些錯誤的原因)。我試圖將所有文件在DIR樹中上移兩級,同時以其他所有方式保留文件結構。這裏是我的意思的例子:

|--- DIR.Main 
|--- |---DIR.Sub-A 
|--- |--- |--- File.Sub-A 
|--- |---DIR.Sub-B 
|--- |--- |--- File.Sub-B 
|--- |---DIR.Sub-C 
|--- |--- |--- File.Sub-C 
|-->Continue for approx. 50 DIR.Subs 

我不需要在文件結構中的DIR.Sub水平,並希望它看起來像這個:

|--- DIR.Main 
|--- |---File.Sub-A 
|--- |---File.Sub-B 
|--- |---File.Sub-C 

這裏是什麼複利問題,雖然:文件名不整潔和有序的邏輯與前面的例子中,而是被隨意命名如下:

|--- DIR.Main 
|--- |---DIR.Sasjaljesea 
|--- |--- |--- File.Sasjalsaejesea.mpg 
|--- |---DIR.qwerqwerewqwer 
|--- |--- |--- File.qwerqweresezswqwer.mpg 
|--- |---DIR.xcbxcvxcvbxcvb 
|--- |--- |--- File.xcsfasdbxcvxcvbxcvb.mpg 
|-->ETC 

然而,救命之恩的是,在上述考試所有文件共享相同的文件類型(在這種情況下爲mpg)。

我讀過的MV,並在猛砸CP相關文件,並沒有能夠拿出一個辦法做到這一點在一個沒有通過手動輸入所有的文件名。我還研究了Xrandr和類似命令的選項。我已經能夠得出一個解決方案最接近的是這樣的:

find /path/to/search -type f -iname "*.mp3" -exec mv {} path/to/music \; 

從這個答案摘自:Moving multiple files in subdirectories (and/or splitting strings by multichar delimeter) [bash]

在哪裏我明明糾正-iname改爲.mpg和DIR的適合我的情況。

當我做這個它沒有找到的所有文件,並將它們轉移到我想要的文件夾,但它並置的所有文件到一個不可讀.MPG文件,而不是複製遞歸每個單獨的文件,並保持文件結構,我想。我已經在上面的命令中用cp遞歸地研究了cp,但是這似乎什麼也不做,即使當我作爲SUDO執行時也是如此。 cp帶有額外的問題,我不想複製文件,只需刪除它們所包含的中間文件夾即可。

你可能已經想通了,我試圖避免簡單地使用Linux中的GUI和去猛砸路線,原因很明顯,這將需要幾個小時才能做到這一點的窗口管理器,而我敢肯定有是在幾秒鐘內在Bash中完成的一種方法。這是一項任務,在Linux文件管理器中通常需要幾秒鐘的時間,如果有人正在處理少於十幾個文件夾和文件移動,但目前的情況是,幾十個不必要的DIR包裝只有一個文件。因此,我需要一個乾淨的Bash解決方案。

再次感謝您的幫助。這是幾個星期來令我感到沮喪的問題。

我歡迎任何問題。

+0

對文件操作的模式問題,尤其是'DIR ...'圖。繼續發帖,祝你好運! – shellter 2014-09-29 03:33:26

回答

1

xargsmv一起使用可以解決這個問題。您應該從當前工作目錄DIR.Main開始,並使用不同的目錄將所有內容都移動到。它需要有所不同,因爲否則你會最終得到與新文件和目錄相匹配的(空的)原始目錄。我們可以解決這個問題,但我認爲沒有必要。

find -maxdepth 2 -mindepth 2 | xargs -I '{}' mv '{}' <PATH_TO_NEW_LOCATION>/ 

find結果是,正是一層進一步進入目錄樹比當前目錄下的所有文件和目錄的列表。然後調用xargs將所有這些結果移到給定的位置。

我已經測試過它,但是您可能還想在將它用於實時數據之前對其進行測試,或者至少需要複製一份。

+0

由於某些原因,我必須給「其他」(創建和刪除文件)的完全許可,否則我得到了「無法移動文件示例,權限被拒絕」。 - 甚至當我像SUDO一樣跑步時。我不確定這是爲什麼,但一旦我給了新的權限,這解決了我的問題。非常感謝你。 – lawreaf 2014-09-29 06:56:55

+0

如果你把'sudo'放在這個命令的前面,那麼它只會應用到'find'命令,而不是實際進行移動的'xargs'命令。很高興你的工作雖然。 – gandaliter 2014-09-29 11:02:11

0

這應該是一樣簡單

shopt -s dotglob; mv -iv DIR.Main/*/* DIR.Main/ 

如果碰到ARG_MAX把它放在一個循環

shopt -s dotglob; for f in DIR.Main/*/*; do mv -iv "$f" DIR.Main/ 
相關問題