簡體   English   中英

我如何循環瀏覽特定數量的文件夾

[英]How do i loop through certain number of folders

我正在嘗試遍歷具有 744 個子目錄的文件夾。 我如何只循環瀏覽特定數量的文件夾。 由於我有 744 個子目錄,我會將其分成兩半並循環遍歷前 372 個目錄,然后循環遍歷其余 372 個目錄。 我想確保我不會多次復制目錄。 以下是我嘗試做的,但我想知道這樣做以避免重復的有效方法是什么。

for d in `ls -tr|tail -372`
do
echo $d
done

由於我的xargs回答沒有收到任何反饋,這是另一種方法。

printf "%s\n" */ |
awk 'BEGIN { n=1; OFS="\t"
        split("first:second:third", destination, /:/) }
    (i++ % 372)=0 { ++n }
    { print destination[n], $0 }'

這將在每個目錄名稱前添加一個字段,您可以使用該字段進一步處理結果。 示例輸出:

first   directory1/
first   directory2/
first   directory3/
:
first   directory372/
second  directory373/
second  directory374/
:
second  directory743/
second  directory744/

所以從未使用過 Awk 腳本中的third字段值,但我還是把它放在里面是為了證明這可以很容易地擴展到做三向分區、四向分區或你有什么。

您可以通過管道來使用它

while IFS= read -r dest dir; do
    echo mv "dir" "$dest"
done

xargs -0答案不同,這對任意文件名不可靠; 特別是,包含換行符的目錄名稱將無法正常工作。

其實一個更好的解決辦法是分割的文件的其他方式-即一個雙向的分區,打印first每隔一行,並且second每隔。 然后您不必對項目數進行硬編碼,只需對分區數進行硬編碼。

printf "%s\n" */ |
awk 'BEGIN { OFS="\t"
        n = split("ernie:bert", host, /:/) }
    { print host[1+((NR-1)% n)], $0 }' |
while IFS= read -r server dir; do
    mkdir -p "$server"
    mv "$dir" "$server/"
done

無論目錄的數量如何,這都會將它們均勻地分成目錄erniebert ,樂觀地假設您(也)可能已經以芝麻街字符命名您的文件服務器。

如果你想scp目錄而不是mv它們,按服務器名稱對它們進行分組會更有效率; 但如果有必要,一個簡單的sort會照顧到這一點。 (這不是我們在每個文件名之前打印目標的唯一原因;這也很有用,因為這樣我們就不必擔心目錄名可能包含我們的字段分隔符。)

您可以使用xargs但這需要 372 個目錄名稱以適合一次調用(即組合的目錄名稱不得超過ARG_MAX )。

printf '%s\0' */ |
xargs -n 372 -r -0 sh -c '
    d=dest$$; mkdir "$d"; cp "$@" "$d"' _

這將生成一個帶有前綴dest的唯一新目錄,並為它復制的每批目錄生成一個編號。 可能有更好的方法來分割文件(並且從xargs調用sh並不是一個對新手友好的答案),但也許這至少應該給你一些想法。

更詳細地說, xargs -n 372限制了一次性處理的參數數量,您傳遞給xargs的命令可能會簡單得多; xargs -n 372 cp -t fnord會將前 372 個目錄復制到fnord ,然后再復制 372 個; 但是為了使這真正有用,我們希望每次調用xargs時都更改目標目錄,因此我放入了一個簡單的腳本來執行此操作。

您還需要了解 372 是最大值,如果目錄名稱真的很長, xargs可以決定它需要傳遞更少的目錄,以免超過“參數列表太長”的限制。 但是對於您的用例,在任何遠程現代系統上,無論如何我們都可能遠低於該限制。

xargs -0cp -t是 GNU 擴展,即它們應該在 Linux 上開箱即用,並且您可以在大多數其他平台上安裝它們; 如果您真的需要在不安裝外部工具的情況下支持 Solaris 之類的東西,那將更具挑戰性。


附錄:這是 Awk 答案中ernie & bert部分的xargs實現:

printf "%s\0" */ |
xargs -r -0 -n 2 sh -c '
    mkdir -p ernie bert
    mv "$1" ernie
    mv "$2" bert' _

如果您的輸入目錄數量奇數,那么最后一項會出現丑陋但無害的錯誤消息。 有明顯但不優雅的方法來解決這個問題,或者優雅但晦澀的方法; 但我現在更喜歡保持簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM