[英]Shell script to rename multiple files from their parent folders name
我有這樣的文件結構:
因此,有8位數字的文件夾包含一個或多個文件,名稱以8位數字開頭。 但是這些文件名 - 比方說 - 不同步。 所以現在我嘗試在bash中遞歸地重命名它們來存檔:
我的腳本看起來像:
#! /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腳本。
這是你如何只使用bash
和mv
來做到這一點:
#!/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.