Files
用父文件夾名稱替換文件名
我有一堆文件,每個文件都在他們自己的子目錄中。我需要編寫一個腳本來重命名每個文件,使其與其目錄具有相同的名稱:例如,給定:
./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