Files

用父文件夾名稱替換文件名

  • June 13, 2013

我有一堆文件,每個文件都在他們自己的子目錄中。我需要編寫一個腳本來重命名每個文件,使其與其目錄具有相同的名稱:例如,給定:

./1111/1234.pdf
./2222/2345.pdf
./1234/3214.pdf

我需要將它們重命名為:

./1111/1111.pdf
./2222/2222.pdf
./1234/1234.pdf

我怎樣才能做到這一點?

假設你的 shell 是 zsh,放入autoload -U zmv你的~/.zshrc,然後執行

zmv '(*)/*.pdf' '$1/$1.pdf'

以下bash腳本在父目錄中呼叫時完成這項工作。即使文件並非都具有相同的副檔名(它們在您的有限範例中,但這可能是巧合),它也會這樣做:

#!/bin/bash
function dirnametofilename() {
 for f in $*; do
   bn=$(basename "$f")
   ext="${bn##*.}"
   filepath=$(dirname "$f")
   dirname=$(basename "$filepath")
   mv "$f" "$filepath/$dirname.$ext"
 done
}

dirnametofilename ./????/*

那裡的呼叫假定目前目錄的子目錄中的任何文件具有四個字元的名稱。您可以將最後一行替換為:

dirnametofilename $*

並將文件名指定為腳本的參數


下面創建了一個更深層次的層次結構並使用 find 來定位文件。export -f確保bash啟動者find知道該功能:

mkdir -p x/y/z/1111 x/y/z/2222 x/y/z/1234
touch x/y/z/1111/1234.pdf
touch x/y/z/2222/2345.pdf
touch x/y/z/1234/3214.pdf

function dirnametofilename() {
 for f in $*; do
   bn=$(basename "$f")
   ext="${bn##*.}"
   filepath=$(dirname "$f")
   dirname=$(basename "$filepath")
   mv "$f" "$filepath/$dirname.$ext"
 done
}

export -f dirnametofilename

find . -name "*.pdf" -exec bash -c 'dirnametofilename "{}"'  \;
# and look at the result
find x

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