Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在ssh中递归地从文件中删除前缀_Linux_Unix - Fatal编程技术网

Linux 在ssh中递归地从文件中删除前缀

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

我有一大堆图像文件夹(很多!),一些缩略图有一个“tn”前缀,而其他的没有,所以为了能够为所有人编写一个图库,我尝试从整个目录中递归包含“tn”的文件的开头删除它

因此,有问题的缩略图将包含以下文件:

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
ie
j
中的所有文件夹上循环包含
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
ie
j
中的所有文件夹上循环包含
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存在于同一目录中