Shell-Script
按文件夾名稱重命名文件
我有一種文件夾(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 和衍生產品上