簡體   English   中英

如何在bash腳本中基於父文件夾和子文件夾的名稱重命名文件

[英]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中定義字段分隔符和輸出字段分隔符,然后只打印初始文件名和新文件名
  • 您使用xargs將按2分組的結果輸出傳遞給cp命令,並且完成了竅門

已測試

在此處輸入圖片說明

去做:

您只需要使用環境中的內容來設置source_foldertarget_folder變量,並將其最終放入腳本中就可以了!

如果您有基於perlrename命令

$ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM