批量複製到多個目錄

批量複製到多個目錄

我的目錄中有大約 9000 個文件,我想按文件名順序將它們轉移到 100 個目錄中的 90 個文件中,忽略任何剩餘部分。在將多個檔案從檔案名稱 X 複製到檔案名稱 Y?,迦勒寫在一個評論

如果物件只是對它們進行批處理,那麼有一個更簡單的方法!ls | xargs -iX -n20 cp X target_folder/將以 20 個為一組對檔案執行 cp,直到全部完成。

因此,基於使用 xargs,我該如何切換 target_folder 以建立新資料夾並循環命令 100 次?

答案1

在 中bash,嘗試以下程式碼:

#!/bin/bash

c=0

for f; do
    if ! ((c % 100)); then
        folder=folder_$(printf "%03d\n" $c)
        mkdir -p $folder
    fi

    [[ -d "$f" ]] || mv "$f" "$folder"
    ((c++))
done

像這樣運行腳本:

./script.bash *

答案2

該命令看起來與您想要執行的操作不太接近。xargs可以提供幫助,但使用起來很麻煩,除非您知道檔案名稱不包含任何空格或引號字元。這是一個 shell 循環,它將檔案分派到新建立的子目錄中,每個目錄 90 個。

set -- *
# Set args to "$1" "$2" ... "$90"
i=1 args=
while [ $i -le 90 ]; do
  slice="$slice \"\${$i}\""
  i=$((i+1))
done
# Move files 90 at a time
i=0
while [ $# -ge 90 ]; do
  mkdir part$i
  eval "mv $slice part$i"
  shift 90
done
# 0 to 89 files remain in the current directory

答案3

parallel支援運行多個命令,其中\;{#}是序號:

ls|parallel -n90 mkdir {#}\;mv {} {#}

或者,如果檔案名稱不包含空格、引號或反斜線:

i=1;while read l;do mkdir $i;mv $l $((i++));done< <(ls|xargs -n90)

相關內容