Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.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如何向文件名及其父目录添加后缀_Linux_Shell_Rename - Fatal编程技术网

Linux如何向文件名及其父目录添加后缀

Linux如何向文件名及其父目录添加后缀,linux,shell,rename,Linux,Shell,Rename,我有这些文件和许多其他文件: $ ls * blue-3454534: banana.txt file1.txt green-junkjunk: fever.txt vegan.txt yellow-junkkkjunkkk: funny.txt sunny.txt 我想运行一个命令(循环),该命令将重命名: 从banana.txt到blue_banana.txt file1.txt到blue_file1.txt fever.txt至green_fever.txt vegan.

我有这些文件和许多其他文件:

$ ls *
blue-3454534:
banana.txt  file1.txt

green-junkjunk:
fever.txt   vegan.txt

yellow-junkkkjunkkk:
funny.txt   sunny.txt
我想运行一个命令(循环),该命令将重命名:

  • 从banana.txt到blue_banana.txt
  • file1.txt到blue_file1.txt

  • fever.txt至green_fever.txt

  • vegan.txt至green_vegan.txt

  • fully.txt至黄色\u fully.txt

  • sunny.txt到yellow_sunny.txt
因此,正如您所理解的,它会将父目录名放在开头(前缀),直到破折号(并忽略破折号后面的剩余部分)

理想情况下,我会在1命令行循环中使用mv或rename命令

此外,重命名后的文件应保留在已存在的目录中

谢谢你的帮助


PS:文件名和目录名中都没有空格假定目录名存储在变量
子目录中,文件名(不含目录部分)存储在变量文件中,以所需方式重命名它的一种方法是

cd $subdir
mv $file ${subdir%-*}_$file
cd -
%-*
部分在破折号之前获取directoryname的部分

此解决方案适用于bash、zsh和ksh


有关
%-
扩展如何工作的详细信息,请参阅bash手册页中“参数扩展”标题下的精彩解释。对于Zsh,它位于名为zshexpn的手册页中,并位于“参数扩展”(全部大写)标题下。对于ksh,节的名称只是参数

你试过什么?所以这不是免费的编码服务。这应该是一个简单的
for
循环。如果重命名的文件仍保留在它们的子目录中,那么您将有
blue/blue\u banana.txt
等?@KeithThompson是的,它们应该保留。谢谢,请更新问题以反映这一点。请参阅@Barmar的评论。@Barmar我只在*中为subdir做了
;执行mv$subdir/file.txt$subdir.txt;完成
,但它会将整个文件名重命名为父目录名。您可能需要添加一点,即您依赖于删除子字符串的参数扩展,并解释这是什么以及如何使用它(在不止一个单独的情况下)。无需使用子字符串替换进行参数扩展,但至少应涵盖
'%'
'%'
''.'.'.'.'.'.'和
'.\/code>的情况。这一点很好。这些东西在手册页中很难找到,我会指出在哪里可以找到它(手册页中的解释比我自己能写的任何东西都好)。。。