我在各種子目錄中有一個帶有高解析度影像(大約 100Gb)的主目錄 A。我在具有不同子目錄(幾千個檔案)的另一個目錄 B 中選擇了解析度較低的那些影像(相同的檔案名)。
我希望能夠獲得相同目錄 B 結構的副本,但替換為高解析度版本。決議的代理可能是檔案大小,因為目錄 A 中只有一個匹配項。
我對 bash 腳本有一些經驗,但我通常從教程開始,但我找不到任何教程。任何指標表示贊賞!
uj5u.com熱心網友回復:
從為什么您需要在腳本中考慮檔案大小或解析度的問題有點不清楚。我將假設(1)檔案名在整個(子)目錄結構中是唯一的A,B并且(2)A總是包含相同或更高解析度的影像,其中一些具有縮略圖(由檔案名匹配)下B。大綱可能如下所示:
replace_files_by_name() {
local -r dir_A="$1" # full size ("source")
local -r dir_B="$2" # thumbnails ("index")
local -r dir_C="$3" # full size copy by index ("destination")
local path
# Create an index of file names and paths under $dir_A
local -A path_index # maps file names to paths under $dir_A
while IFS= read -r path; do
path_index["${path##*/}"]="$path"
done < <(find "$dir_A" -type f)
# Make a recursive copy of $dir_B called $dir_C.
echo cp -a --reflink "$dir_B" "$dir_C"
cp -a --reflink "$dir_B" "$dir_C"
# Replace each file under $dir_C with its counterpart from $dir_A.
find "$dir_C" -type f | while IFS= read -r path; do
echo cp -a --reflink "${path_index["${path##*/}"]}" "$path"
cp -a --reflink "${path_index["${path##*/}"]}" "$path"
done
}
旁注 0:如果您有一個過時的檔案系統,那么您將不得不以--reflink巨大的性能和空間成本放棄 . 這就是為什么最好使用功能齊全的檔案系統(至少支持 CoW(CoW == Copy on Write))。(示例包括 Btrfs 或 ZFS。)
旁注 1:我的大綱跳過了所有錯誤檢查,需要進行相應調整。(例如,當C( B) 中的檔案在 下找不到時會發生什么A?)
現在讓我們測驗一下解決方案:
set -eu
mkdir -p ~/tmp/test
cd ~/tmp/test
# Create directories A and B and 5 different subdirectories in each.
mkdir -p A/{1..5}/ B/{a..e}/
# Place a file in each subdirectory.
# A and B contain different subdirectory names but same file names.
files=('one' 'two' 'three' 'four' 'five')
for dir in A B; do
subdirs=("${dir}/"*)
((${#subdirs[@]} == ${#files[@]}))
for ((i = 0; i < ${#files[@]}; i)); do
touch "${subdirs[i]}/${files[i]}"
done
done
##############################
replace_files_by_name A B C ##
##############################
rm -Rf ~/tmp/test # cleanup
This↑↑↑ 將輸出(并且還會執行)以下操作:
cp -a --reflink B C
cp -a --reflink A/1/one C/a/one
cp -a --reflink A/2/two C/b/two
cp -a --reflink A/3/three C/c/three
cp -a --reflink A/4/four C/d/four
cp -a --reflink A/5/five C/e/five
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/488392.html
