簡體   English   中英

用於從父文件夾名稱重命名多個文件的Shell腳本

[英]Shell script to rename multiple files from their parent folders name

我有這樣的文件結構:

  • 00000010
    • 000000001.file1
    • 000000001.file2
  • 00000020
    • 00000003.file1
    • 00000003.file2
    • 00000003.file3
  • ...

因此,有8位數字的文件夾包含一個或多個文件,名稱以8位數字開頭。 但是這些文件名 - 比方說 - 不同步。 所以現在我嘗試在bash中遞歸地重命名它們來存檔:

  • 00000010
    • 000000010.file1
    • 000000010.file2
  • 00000020
    • 00000020.file1
    • 00000020.file2
    • 00000020.file3
  • ...

我的腳本看起來像:

#! /bin/bash

find * -maxdepth 1 -name "*" -type d | while read -r dir
do
        rename 's/$dir\/[0-9]{8}/$dir/' *
done

但這不起作用,並給出錯誤

全局符號“$ dir”需要在(eval 1)第1行顯式包名。

我怎么能寫它來根據文件夾名重命名文件?

謝謝你的幫助!

rename使用"代替'

你應該對$dir里面的文件rename ,所以rename的參數必須是$dir/*而不只是*

由於你想用dir/dir替換dir/8digits ,正則表達式的替換部分應該是$dir\\/$dir

通過上述更改,命令如下所示:

rename "s/$dir\/[0-9]{8}/$dir\/$dir/" $dir/*

rename實際上是一個Perl腳本。

這是你如何只使用bashmv來做到這一點:

#!/bin/bash

for dir in *; do
    if test -d "$dir"; then
        (
            cd $dir
            for file in *; do
                newfile=$dir.${file#*.}
                mv "$file" "$newfile"
            done
        )
    fi
done

首先是重現目錄樹的腳本:

$ i=1
$ for dir in 000000{1..2}0; do
mkdir $dir
touch $dir/0000000$i.file{1..3}
i=$((i+1))
done
$ find .
.
./00000010
./00000010/00000001.file1
./00000010/00000001.file2
./00000010/00000001.file3
./00000020
./00000020/00000002.file3
./00000020/00000002.file2
./00000020/00000002.file1

現在顯示腳本工作:

$ ../ren.sh
$ find .
.
./00000010
./00000010/00000010.file1
./00000010/00000010.file2
./00000010/00000010.file3
./00000020
./00000020/00000020.file1
./00000020/00000020.file2
./00000020/00000020.file3

首先,你的find命令中的*放錯了位置 - 你需要給一個目錄來開始搜索。 . 很平常。

其次,你的perl rename命令中的$dir將不會被shell擴展,因為引用了整個字符串。

三, *你遞給你的Perl重命名命令將擴大到當前的工作目錄,這可能不是你打算什么所有的目錄和文件

@ Mikel的答案比我的工作要好得多,但我認為這可能仍然有用。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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