Command-Line

將大量文件複製到日期結構化目錄順序中

  • November 5, 2016

我需要將大約 40.0000 個文件複製到日期結構化文件夾中。

範例文件:

/var/public/voicelogging/quality_monitoring/20151209/bbbbbb_I_20151209-185841_xxxxxx_12434_89343.WAV

是我需要復製到的眾多文件之一/home/username/logging/

文件名中有兩個我需要使用的變數:

bbbbbb_I_20151209-185841_xxxxxx_12434_89343.WAV

20151209當然,日期

12434是製作文件的使用者的 ID。

我需要的是一個腳本/一個襯墊,可以在目錄中搜尋使用者 ID。

然後創建一個帶有使用者 ID 的目錄/home/username/logging。創建文件夾後,它需要為它可以找到的每個日期創建一個目錄。

並將每個文件放入正確的userid/date目錄中。

結果目錄的範例。

/home/username/logging/12434/20151209/bbbbbb_I_20151209-185841_xxxxxx_12434_89343.WAV

我已經建構了一個用於製作日期目錄的單線,但我仍然需要自己製作使用者 ID 目錄。

find /var/public/voicelogging/quality_monitoring/ -type f -name "*12434*" | sed -r 's/^.{65}//' | cut -c1-8 | xargs -I {} mkdir {} /home/username/logging/12434

如何將正確的文件複製到正確的位置?

find使用and的一種方法install

find /var/public/voicelogging/quality_monitoring -name \*.WAV -exec sh -c '
bn=${0##*/}; x=${bn%%-*}; dt=${x##*_}; y=${bn%_*}; id=${y##*_} 
install -D "$0" "/home/username/logging/${id}/${dt}/${bn}"' {} \;

這使用參數擴展來提取日期:${dt}和使用者ID:${id}從文件名中,然後用於install將每個文件複製到相應的userID/date目錄(這是因為我很懶) - 沒有install將最後一行替換為:

dest=/home/username/logging/${id}/${dt}; mkdir -p "${dest}" && cp "$0" "${dest}"' {} \;

如果您更喜歡遍歷那些“日期”目錄,然後遍歷.WAV每個目錄中的文件:

for d in /var/public/voicelogging/quality_monitoring/*; do
 dt=${d##*/}
 for f in $d/*.WAV; do
   bn=${f##*/}; y=${bn%_*}; id=${y##*_}
   dest=/home/username/logging/${id}/${dt}
   mkdir -p "${dest}" && cp "${f}" "${dest}"
 done
done

如果你有zsh它更容易和更短zmv(也因為zsh更聰明,你可以嵌套變數擴展,例如${${file%_*}##*_}足以提取使用者 ID):

dtcp () {                                                                     
mkdir -p $3 && cp $1 $2 $3
}
autoload zmv
zmv -n -p dtcp '/var/public/voicelogging/quality_monitoring/(*)/(*).WAV' \
'/home/username/logging/${${2%_*}##*_}/$1'

(*)s 創建可以在第二個參數 as 中使用的反向引用,$1等等$2

這裡zmv用 with-p執行函式dtcp而不是mv。該函式創建目錄,然後將文件複製到新創建的目錄。參數(不要誤認為上面的反向引用)是:

$1:--

這意味著選項結束

$2:/var/public/voicelogging/quality_monitoring/(*)/(*).WAV'

那是必須複製的文件和

$3:/home/username/logging/${${2%_*}##*_}/$1

是目標

注意-n代表乾執行; 刪除它以實際執行命令。

引用自:https://unix.stackexchange.com/questions/284502