我需要將大約 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
如何將正確的檔案複製到正確的位置?
答案1
find
與的一種方式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 建立可(*)
在第二個參數中使用的反向引用,如$1
等$2
。此函數會建立目錄,然後將檔案複製到新建立的目錄中。參數(不要誤認為上面的反向引用)是:: 表示選項結束: 是必須複製的檔案 :是 目標 注意力代表zmv
-p
dtcp
mv
$1
--
$2
/var/public/voicelogging/quality_monitoring/(*)/(*).WAV'
$3
/home/username/logging/${${2%_*}##*_}/$1
-n
試運行;刪除它以實際運行該命令。