2017-08-09 206 views
0

我正在使用macOS Sierra。目錄中包含的Mv文件到目錄/新路徑

我有1000多個包含大量文件的目錄。 Word,Excel和壓縮文件。只有一個子級別。重要提示:文件名和文件夾名稱中有空格。

我們決定改變文件的樹狀結構;在與另一個目錄樹合併之前,需要將每個目錄中的所有文件移動到名爲「Word & Excel」的子目錄中。

我設法創建Word的Excel &目錄用這個命令:

for dir in */; do mkdir -- "$dir/Word & Excel"; done 

基本上,我只想做

for dir in */; do mv $dir/* "./Word & Excel"; done 

這是行不通的。我甚至不明白,如果問題是與$迪爾 - 我需要雙引號,以避免空間問題,但星號是不會工作,如果我使用雙引號......或用星號。

我試圖根據網站上發現了類似的問題前面的回答,清理結果的子文件夾(並試圖基本上避免我的通配符的問題),以獲得更清潔的版本:

for dir in */; do mv `ls -A "$dir" | grep -v "Word & Excel"` ./"Word & Excel" | cd ../ ; done 

我我完全卡住了。

任何想法如何處理?

回答

0

即使在Mac OS X上也應該這樣做。並且是的,find有時需要anchor目錄。

while read dir; do 
    mkdir -p "$dir/Word & Excel" 
    find "$dir" -maxdepth 1 -type f -exec mv {} "$dir/Word & Excel" \; 
done < <(find . -mindepth 1 -maxdepth 1 -type d) 

這遍歷當前目錄下的子目錄(僅一個子級),爲他們每個人(dir)的,創建dir/Word & Excel分次目錄,如果它不存在,查找所有正常文件在dir之內,並將它們移動到dir/Word & Excel,並且它應該可以在瘋狂的目錄和文件名稱下工作

這就是說,如果你可以說服你的老闆不要使用不尋常的文件或目錄名稱,那麼使用bash和命令行界面(CLI)的生活可能會容易得多。

+0

非常感謝。像魅力一樣工作。順便說一句,我不幸是老闆。我在7年前開始業務時沒有注意到這個問題......我不會兩次犯同樣的錯誤。祝你有個美好的一天 – dacasine

+0

@dacasine好的,很好,因爲你是老闆,我可以建議你選擇'WordAndExcel'而不是'Word&Excel'嗎?沒有空格,沒有'&'(在CLI中有特殊含義的另一個特殊字符)。我發誓,你會在某天或那天感謝這一決定。 –

+0

你說得對。我會肯定地改變它。我們認爲它是用戶友好的,但我們忘記了,有時候,CLI是處理大量文件列表的最好的朋友。 – dacasine

0

好的,我將使用「子文件夾」作爲我的子文件夾名稱。

首先,每其中之一的所有迪爾斯

for dir in $(find -type d | grep "/");do mkdir $dir/subfolder; done 

我中創建子文件夾,我創建了一個文件。我爲了顯示目錄內移動所有文件到子文件夾,我會做這樣的事情:

for dir in $(find -type d | grep -vE 'subfolder' | grep '/');do for file in $(find $dir -type f);do mv $file $dir/subfolder;done ;done 

您可能希望在找到--exec實驗,但只是建立一個嵌套的循環是最快的解決方案給我。

讓我爲你分解它。在這裏,我嘗試查找我路徑中的所有目錄,不包括子文件夾目錄和當前目錄。我本可以用-maxdepth 0與找到,但因爲我只有這些迪爾斯,它不是必要現在

for dir in $(find -type d | grep -vE 'subfolder' | grep '/') 

,在每個那些顯示目錄的,我們試圖找到的所有文件(在你的情況下,壓縮文件和現在怎麼辦)。

do for file in $(find $dir -type f) 

現在,我們只是將找到的文件從第一個循環移動到子文件夾名稱後面的目錄中。

do mv $file $dir/subfolder;done ;done 

請記住,由於第一循環在最後關閉時,它會做移動操作1個目錄的時間,以及在只有目錄中的所有文件。嵌套循環可能有點棘手,尤其是當別人以他們自己的方式做時,我知道:(

+0

嗨py9,非常感謝你的回答。對我來說似乎很邏輯。這就是說,我試過這個命令,但是macOS bash發現了一個非法的選項--t。我再次檢查,用-t - 替換-type,bash不接受。你有什麼想法,爲什麼? – dacasine

+0

嘿,不幸的是我沒有在MacOS上工作,所以我無法測試這個,但是搜索它看起來MacOS版本的find需要包含路徑。在這種情況下,'find -type f'不會起作用,相反,你應該包含路徑,這將基本上......值得一試。更多信息在這裏:https://stackoverflow.com/questions/17548854/difference-between-mac-find-and-linux-find – py9

+0

謝謝。嘗試*,但由於空間錯誤而被阻止。 – dacasine

相關問題