[英]How to rename file based on parent and child folder name in bash script
我想根據父/子目錄名稱重命名文件。
例如:位於以下位置的test.xml文件
/usr/local/data/A/20180101
/usr/local/data/A/20180102
/usr/local/data/B/20180101
如何將test.xml文件保存在/ usr / local / data / output中為
A_20180101_test.xml
A_20180102_test.xml
b_20180101_test.xml
嘗試應如下腳本,但無濟於事。
#!/usr/bin/env bash
target_dir_path="/usr/local/data/output"
for file in /usr/local/data/*/*/test.xml; do
l1="${file%%/*}"
l2="${file#*/}"
l2="${l2%%/*}"
filename="${file##*/}"
target_file_name="${l1}_${l2}_${filename}"
echo cp "$file" "${target_dir_path}/${target_file_name}"
done
我在這個腳本中做錯什么了嗎?
我已經對您的代碼進行了一些修改以使其正常工作。 查看代碼中的注釋
target_dir_path=""/usr/local/data/output"
for file in /usr/local/data/*/*/test.xml; do
tmp=${file%/*/*/*}
curr="${file#"$tmp/"}" # Extract wanted part of the filename
mod=${curr//[\/]/_} # Replace forward slash with underscore
mv "$file" "$target_dir_path$mod" # Move the file
done
您可以使用以下命令來執行此操作:
source_folder="usr/local/data/";target_folder="target"; find $source_folder -type f -name test.xml | awk -v targetF=$target_folder 'BEGIN{FS="/"; OFS="_"}{printf $0" "; print targetF"/"$(NF-2),$(NF-1),$NF}' | xargs -n2 cp;
或幾行以提高可讀性:
source_folder="usr/local/data/";
target_folder="target";
find $source_folder -type f -name test.xml |\
awk -v targetF=$target_folder 'BEGIN{FS="/"; OFS="_"}{printf $0" "; print targetF"/"$(NF-2),$(NF-1),$NF}' |\
xargs -n2 cp;
哪里
target_folder
是您的目標文件夾 source_folder
是您的源文件夾 find
命令將搜索此源文件夾下存在的所有test.xml
命名文件 awk
命令將接收目標文件夾作為變量,以便可以使用它,然后在BEGIN
bloc中定義字段分隔符和輸出字段分隔符,然后只打印初始文件名和新文件名 cp
命令,並且完成了竅門 已測試 :
去做:
您只需要使用環境中的內容來設置source_folder
和target_folder
變量,並將其最終放入腳本中就可以了!
如果您有基於perl
的rename
命令
$ for f in tst/*/*/test.xml; do
rename -n 's|.*/([^/]+)/([^/]+)/(test.xml)|./$1_$2_$3|' "$f"
done
rename(tst/A/20180101/test.xml, ./A_20180101_test.xml)
rename(tst/A/20180102/test.xml, ./A_20180102_test.xml)
rename(tst/B/20180101/test.xml, ./B_20180101_test.xml)
-n
選項用於空運行,測試后將其刪除 tst
更改為/usr/local/data
並將./
更改為/usr/local/data/output/
以供您使用 .*/
忽略文件路徑 ([^/]+)/([^/]+)/(test.xml)
捕獲所需的部分 $1_$2_$3
根據需要重新安排
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.