Phi*_*e P 5 command-line bash mv
我有一个包含子目录的目录,其中包含许多名为:
file1.tif
file2.tif
file3.tif
file4.tif
file5.tif
file6.tif
file7.tif...
Run Code Online (Sandbox Code Playgroud)
我想添加一个“循环”后缀c1,c2和c3, 以获取文件名:
file1c1.tif
file2c2.tif
file3c3.tif
file4c1.tif
file5c2.tif
file6c3.tif
file7c1.tif...
Run Code Online (Sandbox Code Playgroud)
这在顶级目录的所有子目录中。
但我不知道如何做到这一点。
那可能吗?如何?
使用find+ 基于 perl prename(又名rename在一些早期的 Ubuntus 上),您可以匹配文字之前的数字序列,.然后使用模除法将其写入所需的格式,例如
find . -name '*.tif' -execdir prename -vn -- 's/(\d+)\./sprintf "%dc%d.", $1, ($1-1)%3+1/e' {} +
Run Code Online (Sandbox Code Playgroud)
(这些-vn标志允许您进行“试运行”以查看在提交之前如何重命名文件)。
前任。给予
$ tree
.
??? bar
? ??? file1.tif
? ??? file2.tif
? ??? file3.tif
? ??? file4.tif
? ??? file5.tif
? ??? file6.tif
? ??? file7.tif
??? foo
? ??? egg
? ? ??? file1.tif
? ? ??? file2.tif
? ??? file1.tif
? ??? file2.tif
? ??? file3.tif
??? spam
??? file1.tif
??? file2.tif
4 directories, 14 files
Run Code Online (Sandbox Code Playgroud)
然后
find . -name '*.tif' -execdir prename -- 's/(\d+)\./sprintf "%dc%d.", $1, ($1-1)%3+1/e' {} +
Run Code Online (Sandbox Code Playgroud)
结果是
$ tree
.
??? bar
? ??? file1c1.tif
? ??? file2c2.tif
? ??? file3c3.tif
? ??? file4c1.tif
? ??? file5c2.tif
? ??? file6c3.tif
? ??? file7c1.tif
??? foo
? ??? egg
? ? ??? file1c1.tif
? ? ??? file2c2.tif
? ??? file1c1.tif
? ??? file2c2.tif
? ??? file3c3.tif
??? spam
??? file1c1.tif
??? file2c2.tif
4 directories, 14 files
Run Code Online (Sandbox Code Playgroud)
根据评论编辑:
如果要循环计数器即<number>在c<number>1 到 3 之间循环:
试运行:
shopt -s globstar
for d in **/*/; do
( cd "$d" && pwd && count=1 && shopt -s nullglob && for f in file*.tif; do
echo mv -i "$f" "${f%.tif}"c${count}.tif
if ((count=3)); then
count=1
else
((count++))
fi
done )
done
Run Code Online (Sandbox Code Playgroud)
行动:
shopt -s globstar
for d in **/*/; do
( cd "$d" && count=1 && shopt -s nullglob && for f in file*.tif; do
mv -i "$f" "${f%.tif}"c${count}.tif
if ((count=3)); then
count=1
else
((count++))
fi
done )
done
Run Code Online (Sandbox Code Playgroud)
例子:
$ tree
.
??? bar
? ??? file1.tif
? ??? file2.tif
? ??? file3.tif
? ??? file4.tif
??? foo
? ??? egg
? ? ??? file1.tif
? ? ??? file2.tif
? ??? file1.tif
? ??? file2.tif
? ??? file3.tif
??? spam
??? file1.tif
??? file2.tif
$ shopt -s globstar
$ for d in **/*/; do ( cd "$d" && pwd && count=1 && shopt -s nullglob && for f in file*.tif; do \
echo mv -i "$f" "${f%.tif}"c${count}.tif; if ((count=3)); then count=1; else ((count++)); fi; done ); done
/home/foobar/bar
mv -i file1.tif file1c1.tif
mv -i file2.tif file2c2.tif
mv -i file3.tif file3c3.tif
mv -i file4.tif file4c1.tif
/home/foobar/foo
mv -i file1.tif file1c1.tif
mv -i file2.tif file2c2.tif
mv -i file3.tif file3c3.tif
/home/foobar/foo/egg
mv -i file1.tif file1c1.tif
mv -i file2.tif file2c2.tif
/home/foobar/spam
mv -i file1.tif file1c1.tif
mv -i file2.tif file2c2.tif
$ for d in **/*/; do ( cd "$d" && count=1 && shopt -s nullglob && for f in file*.tif; do \
mv -i "$f" "${f%.tif}"c${count}.tif; if ((count=3)); then count=1; else ((count++)); fi; done ); done
$ tree
.
??? bar
? ??? file1c1.tif
? ??? file2c2.tif
? ??? file3c3.tif
? ??? file4c1.tif
??? foo
? ??? egg
? ? ??? file1c1.tif
? ? ??? file2c2.tif
? ??? file1c1.tif
? ??? file2c2.tif
? ??? file3c3.tif
??? spam
??? file1c1.tif
??? file2c2.tif
Run Code Online (Sandbox Code Playgroud)
原答案:
与bash:
shopt -s globstar
for d in **/*/; do ( cd "$d" && pwd && count=1 && shopt -s nullglob \
&& for f in file*.tif; do echo mv -i "$f" "${f%.tif}"c${count}.tif; \
((count++)); done ); done
Run Code Online (Sandbox Code Playgroud)
这里我们循环遍历目录名,globstarshell 选项让我们递归遍历目录
里面的部分在()子shell中运行,这是为了防止cd在当前shell中被修改
我们正在cd进入目录,查找file*.tif文件并根据需要重命名它们
count重命名时为每个文件保留一个递增计数器
以上是试运行,将向您显示将要进行重命名的目录以及mv将运行什么命令。如果满意,请执行:
shopt -s globstar
for d in **/*/; do ( cd "$d" && count=1 && shopt -s nullglob && \
for f in file*.tif; do mv -i "$f" "${f%.tif}"c${count}.tif; ((count++)); done ); done
Run Code Online (Sandbox Code Playgroud)
有一个警告,因为 shell 进行词法排序,所以文件 egfile10.tif将早于file2.tif. 如果您不希望那样,请在重命名或使用zshwithnumericglobsort选项之前进行一些排序。
| 归档时间: |
|
| 查看次数: |
395 次 |
| 最近记录: |