[英]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
無論目錄的數量如何,這都會將它們均勻地分成目錄ernie
和bert
,樂觀地假設您(也)可能已經以芝麻街字符命名您的文件服務器。
如果你想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 -0
和cp -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.