Linux 在ssh中递归地从文件中删除前缀
我有一大堆图像文件夹(很多!),一些缩略图有一个“tn”前缀,而其他的没有,所以为了能够为所有人编写一个图库,我尝试从整个目录中递归包含“tn”的文件的开头删除它 因此,有问题的缩略图将包含以下文件:Linux 在ssh中递归地从文件中删除前缀,linux,unix,Linux,Unix,我有一大堆图像文件夹(很多!),一些缩略图有一个“tn”前缀,而其他的没有,所以为了能够为所有人编写一个图库,我尝试从整个目录中递归包含“tn”的文件的开头删除它 因此,有问题的缩略图将包含以下文件: tngal001-001.jpg tngal001-002.jpg tngal001-003.jpg 等等 我需要他们: gal001-001.jpg gal001-002.jpg gal001-003.jpg 或者更好的是。。。如果我能把整个tngal001-都取下来,那就太棒了,所以,在g
tngal001-001.jpg
tngal001-002.jpg
tngal001-003.jpg
等等
我需要他们:
gal001-001.jpg
gal001-002.jpg
gal001-003.jpg
或者更好的是。。。如果我能把整个tngal001-
都取下来,那就太棒了,所以,在gallery
目录中,我有:
gal001/thumbnails/tngal001-001.jpg
gal001/thumbnails/tngal001-002.jpg
gal001/thumbnails/tngal001-003.jpg
etc...
gal002/thumbnails/tngal002-001.jpg
gal002/thumbnails/tngal002-002.jpg
gal002/thumbnails/tngal002-003.jpg
etc...
gal003/thumbnails/tngal003-001.jpg
gal003/thumbnails/tngal003-002.jpg
gal003/thumbnails/tngal003-003.jpg
etc...
我更喜欢:
gal001/thumbnails/001.jpg
gal001/thumbnails/002.jpg
gal001/thumbnails/003.jpg
etc...
gal002/thumbnails/001.jpg
gal002/thumbnails/002.jpg
gal002/thumbnails/003.jpg
etc...
gal003/thumbnails/001.jpg
gal003/thumbnails/002.jpg
gal003/thumbnails/003.jpg
etc...
我已尝试查找-f型-名称“tn*”-exec sh-c'表示f;做mv“$f”{f#tn}”;完成“查找sh{}+
和find-输入f-exec sh-c'表示tn*中的文件;执行mv“$file”“${file#tn}”;完成'findsh{}+
但我不太明白。我只是想了解如何去除字母/递归地重命名,因为我只是在想这些东西。我发现的所有其他问题似乎都在谈论从文件名中剥离字符,所有ascii字符和转义空格等都让我感到困惑。如果有人能用简单的英语解释,我将不胜感激。我并不笨,但我是linux的新手!我知道一旦我了解了发生的事情,一切都是合乎逻辑的
先谢谢你,Kirsty
find . -type f -name "tn*" -exec sh -c '
for f; do
fname=${f##*/}
mv -i -- "$f" "${f%/*}/${fname#tn*-}"
done
' sh {} +
在开始从文件名中删除前缀之前,需要将“$f”拆分为父路径和文件名。你忘了在参数扩展中添加一个$
(${f#tn}
)
删除最长的前缀${f##*/}
,并保留文件名,例如*/
(结果与gal001/thumbnails/tngal001-001.jpg -> tngal001-001.jpg
相同)basename“$f”
删除最短后缀${f%/*}
,并保留父路径,例如/*
(结果与gal001/thumbnails/tngal001-001.jpg -> gal001/thumbnails
相同)dirname“$f”
从文件名中删除最短前缀${fname#tn*-}
,例如tn*-
tngal001-001.jpg -> 001.jpg
-I
选项以提示覆盖已存在的文件
在开始从文件名中删除前缀之前,需要将“$f”拆分为父路径和文件名。你忘了在参数扩展中添加一个$
(${f#tn}
)
删除最长的前缀${f##*/}
,并保留文件名,例如*/
(结果与gal001/thumbnails/tngal001-001.jpg -> tngal001-001.jpg
相同)basename“$f”
删除最短后缀${f%/*}
,并保留父路径,例如/*
(结果与gal001/thumbnails/tngal001-001.jpg -> gal001/thumbnails
相同)dirname“$f”
从文件名中删除最短前缀${fname#tn*-}
,例如tn*-
tngal001-001.jpg -> 001.jpg
我添加了
-I
选项以提示覆盖已存在的文件 您可以循环浏览图库中的所有文件夹和文件,然后按如下方式重命名它们
假设您的文件夹结构为
gallery/
gallery/gal001
gallery/gal002
gallery/gal003
...
gallery/gal001/thumbnails/
gallery/gal002/thumbnails/
gallery/gal003/thumbnails/
...
gallery/gal001/thumbnails/tngal001-001.jpg
gallery/gal001/thumbnails/tngal001-002.jpg
gallery/gal001/thumbnails/tngal001-002.jpg
使用cd-gallery
移动到您的gallery
,然后运行以下代码
for j in *;
do
cd $j/thumbnails;
for i in *;
do
echo "Renaming $j/thumbnails/$i --> $(echo $i|sed "s/tn$j-//1")";
mv -i $i $(echo $i|sed "s/tn$j-//1");
done
cd ../..;
done
解释
for j in *;
在gallery
iej
中的所有文件夹上循环包含gal001、gal002、gal003等。
cd $j/thumbnails;
在“gal001/缩略图”目录中移动
for i in *; do
循环遍历目录gal001/thumbnails
中的所有文件,文件名包含在i
中
echo "Renaming $j/thumbnails/$i --> $(echo $i|sed "s/tn$j-//1")"
打印要重命名为的文件名和名称。(如果不想冗长,请将其删除)
mv-i$i newname
重命名$i
(循环中当前文件的值)-i
标志,用于提示重命名后的文件名是否已存在
sed
是流编辑器,通过管道$i
将文件名
导入sed
“s/previous/new/1”
将流中第一次出现的previous
值替换为new
值。这里,将tn
+j
(目录名gal001
)的值(即tngal001-
)替换为“空字符串”(在/
之间无任何内容)
cd../.
要返回到图库
,您可以循环浏览图库
中的所有文件夹和文件,然后按以下方式重命名它们
假设您的文件夹结构为
gallery/
gallery/gal001
gallery/gal002
gallery/gal003
...
gallery/gal001/thumbnails/
gallery/gal002/thumbnails/
gallery/gal003/thumbnails/
...
gallery/gal001/thumbnails/tngal001-001.jpg
gallery/gal001/thumbnails/tngal001-002.jpg
gallery/gal001/thumbnails/tngal001-002.jpg
使用cd-gallery
移动到您的gallery
,然后运行以下代码
for j in *;
do
cd $j/thumbnails;
for i in *;
do
echo "Renaming $j/thumbnails/$i --> $(echo $i|sed "s/tn$j-//1")";
mv -i $i $(echo $i|sed "s/tn$j-//1");
done
cd ../..;
done
解释
for j in *;
在gallery
iej
中的所有文件夹上循环包含gal001、gal002、gal003等。
cd $j/thumbnails;
在“gal001/缩略图”目录中移动
for i in *; do
循环遍历目录gal001/thumbnails
中的所有文件,文件名包含在i
中
echo "Renaming $j/thumbnails/$i --> $(echo $i|sed "s/tn$j-//1")"
打印要重命名为的文件名和名称。(如果不想冗长,请将其删除)
mv-i$i newname
重命名$i
(循环中当前文件的值)-i
标志,用于提示重命名后的文件名是否已存在
sed
是流编辑器,通过管道$i
将文件名
导入sed
“s/previous/new/1”
将流中第一次出现的previous
值替换为new
值。这里,将tn
+j
(目录名gal001
)的值(即tngal001-
)替换为“空字符串”(在/
之间无任何内容)
cd../.
要返回到库
是否有可能gal001-001.jpg
可能已经与tngal001-001.jpg
存在于同一目录中?我不知道,gal001-001.jpg
是否已经与tngal001-0存在于同一目录中