Shell-Script

按文件夾名稱重命名文件

  • November 12, 2021

我有一種文件夾(A、B、C、D、E、F、G、H),每個文件夾中有一個文件在所有文件夾(file.txt)中具有相同的名稱,但這個文件的大小因文件夾而異。我想將此文件從每個文件夾複製到一個新文件夾(X)中,並為該文件提供與原始文件夾相同的名稱。我使用這個 bach 腳本來複製文件:

#!/bin/bash      
insub_FIM_M_1=path to a parent folder conatin all the folders (A,B,C,D,E,F,G,H) 

for i in $(cat $insub_FIM_M_1/FIM_1.txt); do
cp  insub_FIM_M_1/${i} <path to the new folder X >
done

在此程式碼中,所有文件都將覆蓋在新文件夾 (X) 中,因為它們在文件夾中具有相同的名稱。如何修改此程式碼以將文件夾名稱添加到文件名中,以便我可以知道文件的來源。

假設您的子目錄位於$insub_FIM_M_1並且您要複製的文件file.txt在每個子目錄中被呼叫,那麼

mkdir -p result || exit 1
for pathname in "$insub_FIM_M_1"/*/file.txt; do
   cp "$pathname" "result/$( basename "$( dirname "$pathname" )" )_file.txt"
done

將這些文件複製到result目前目錄中的目錄,同時根據它們所在的目錄重命名每個文件。

在目錄是父目錄的特殊情況下,您可以使用 rename/prename

$$ 1 $$從父目錄將文件移動到該父目錄:

rename -n 's:/:-:g' */file.txt

-n用於試執行,將其刪除或替換-v為實際執行)

如果.txt文件有幾個級別(或未知深度),您可以使用 globstar 選項:

shopt -s globstar  # makes '**' match any levels of directories
rename -n 's:/:-:g' **/*.txt

$$ 1 $$該命令rename在 Debian/Ubuntu 和衍生產品上,prename在 Redhat/Fedora 和衍生產品上

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