Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.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_Bash_Rename_Echo_Mv - Fatal编程技术网

Linux 递归地将文本前置到文件名

Linux 递归地将文本前置到文件名,linux,bash,rename,echo,mv,Linux,Bash,Rename,Echo,Mv,我想在当前目录或子目录中的每一个特定类型的文件名前面加上文本,在本例中是.txt文件 我试过: find -L . -type f -name "*.txt" -exec mv "{}" "PrependedTextHere{}" \; 这方面的问题是处理/引用附带的路径的/部分 感谢您的帮助或其他方法。这里有一个快速尝试。如果有帮助,请告诉我 for file in $(find -L . -type f -name "*.txt") do parent=$(echo $file | sed

我想在当前目录或子目录中的每一个特定类型的文件名前面加上文本,在本例中是.txt文件

我试过:

find -L . -type f -name "*.txt" -exec mv "{}" "PrependedTextHere{}" \;
这方面的问题是处理
/
引用附带的路径的
/
部分


感谢您的帮助或其他方法。

这里有一个快速尝试。如果有帮助,请告诉我

for file in $(find -L . -type f -name "*.txt")
do
parent=$(echo $file | sed "s=\(.*/\).*=\1=")
name=$(echo $file | sed "s=.*/\(.*\)=\1=")
mv "$file" "${parent}PrependedTextHere${name}"
done

这里有一个快速射击。如果有帮助,请告诉我

for file in $(find -L . -type f -name "*.txt")
do
parent=$(echo $file | sed "s=\(.*/\).*=\1=")
name=$(echo $file | sed "s=.*/\(.*\)=\1=")
mv "$file" "${parent}PrependedTextHere${name}"
done

您只是想将文件移动到前面有
Prepend
的新文件名吗

for F in *.txt; do mv "$F" Prepend"$F"; done
还是希望它处理子目录并在目录和文件名之间加前缀:

dir1/PrependA.txt
dir2/PrependB.txt

您只是想将文件移动到前面有
Prepend
的新文件名吗

for F in *.txt; do mv "$F" Prepend"$F"; done
还是希望它处理子目录并在目录和文件名之间加前缀:

dir1/PrependA.txt
dir2/PrependB.txt

你可以这样做

find -L . -type f -name "*.txt" -exec bash -c 'echo "$0" "${0%/*}/PrependedTextHere${0##*/}"' {} \;
在哪里

  • bash-c'…'
    执行命令
  • $0
    是传入的第一个参数,在本例中为
    {}
    ——完整文件名
  • ${0%/*}
    删除所有内容,包括文件名中最后一个
    /
    之后的内容
  • ${0##*/}
    删除文件名之前的所有内容,包括最后一个
    /

一旦您满意它的工作情况,请将其替换为

你可以这样做

find -L . -type f -name "*.txt" -exec bash -c 'echo "$0" "${0%/*}/PrependedTextHere${0##*/}"' {} \;
在哪里

  • bash-c'…'
    执行命令
  • $0
    是传入的第一个参数,在本例中为
    {}
    ——完整文件名
  • ${0%/*}
    删除所有内容,包括文件名中最后一个
    /
    之后的内容
  • ${0##*/}
    删除文件名之前的所有内容,包括最后一个
    /

一旦您满意它的工作情况,请将其替换为

这应该是可行的,因为长文件名没有新行字符。在这种情况下,将find设置为use-print0,并将IFS设置为null

#!/bin/sh
IFS='
'
for I in $(find -L . -name '*.txt' -print); do
    echo mv "$I" "${I%/*}/prepend-${I##*/}"
done

p、 删除回音以使脚本有效,这样做是为了避免将粘贴内容从这里随机复制到shell中的人发生意外损坏。

只要文件名没有新行字符,这应该可以工作。在这种情况下,将find设置为use-print0,并将IFS设置为null

#!/bin/sh
IFS='
'
for I in $(find -L . -name '*.txt' -print); do
    echo mv "$I" "${I%/*}/prepend-${I##*/}"
done

p、 删除回音以使脚本有效,它的存在是为了避免将粘贴内容从此处随机复制到其外壳的人意外损坏。

在发布之前是否尝试运行此功能?发生什么事了?谢谢@Johnsyweb。起初我并不正确。我已经编辑过,并且相信它应该更好。你几乎不应该在bash中对$(command)中的某个东西执行
。有太多的分词问题会导致语法失败(例如,包含空格的文件)。看见使用
while/read
循环或他们的管道示例之一进行进程替换会更好。您是对的,这对名称或路径中有空格的文件不起作用,这里可能有一个很好的免责声明…bash中的内部字段分隔符(IFS)通常设置为
$'\t\n'
(空白),这意味着bash将假定一个空格分隔标记,因此它将带空格的文件名拆分为单独的标记以循环,而不是一个文件名。您在发布之前是否尝试运行过此操作?发生了什么事?感谢@Johnsyweb。起初我不正确。我已经编辑过,并且相信它应该更好。您几乎不应该这样做在bash中对$(command)
中的某些内容执行
。分词问题太多,会导致语法失败(例如,包含空格的文件)。请参阅。使用
while/read
循环或其中一个管道示例进行流程替换会更好。您是对的,这对名称或路径中包含空格的文件不起作用,可能需要在此处添加一点免责声明…内部字段分隔符(IFS)在bash中,通常设置为类似于
$'\t\n'
(空白)的值,这意味着bash将假定一个空格分隔标记,因此它将带空格的文件名拆分为单独的标记以循环,而不是一个文件名。我希望在所有子目录中处理此类文件。我明白了。我建议使用@BroSlow的解决方案,但可能需要使用
basename
dirname
来解决获取文件夹和文件。我想处理所有子目录中的此类文件。我明白了。我建议使用@BroSlow的解决方案,但可能使用
basename
dirname
来获取文件夹和文件。这就是我要找的!一个问题:
{
在这行的末尾,它到底在做什么?@user3477312它只是一个符号,被
find
命令用作当前正在处理的文件名的占位符。将它放在exec的末尾,只是将它作为参数传递给正在执行的命令。这就是我要寻找的!一个问题:它是什么
{}
在行尾到底在做什么?@user3477312它只是一个符号,被
find
命令用作当前正在处理的文件名的占位符。将它放在exec的末尾,只是将它作为参数传递给正在执行的命令。