0

我想为目录中的每个文件及其内容添加序号。序号应以文件名为前缀,并且其内容的每一行都应以相同的数字为前缀。以这种方式,应该为目录的子文件夹中的所有文件(名称及其内容)生成序号。

我尝试使用 maxdepth、rename、print 功能作为一部分。但它会抛出错误,说“-maxdepth” - 不是一个有效的选项。

我已经有一部分代码(用于打印目录中文本文件的名称和内容)并且应该附加此逻辑。

#!bin/bash
cd home/TESTING
for file in home/TESTING;
do
find home/TESTING/ -type f -name *.txt -exec basename {} ';' -exec cat {} \;
done

Ps - 打印、重命名、maxdepth 不起作用

如果第一个文件的名称为 File1.txt,其内容为“Louis”,则文件名的输出应为 1File1.txt,内容应为“1Louis”。第二个应替换为 2文件。以这种方式,它必须遍历目录中的所有子文件夹并相应地打印。我已经有一部分代码,应该附加这个逻辑。

4

1 回答 1

2

如果在脚本中执行 cd 应该有故障保护。如果不这样做,您可以在错误的目录中执行命令。

在您的尝试中,即使没有 for 循环,输出也是相同的,因为for file in home/TESTINGhome/TESTING作为参数传递给,for因此它只运行一次。在 for file in home/TESTING/*这种情况下会发生其他情况。

我使用 find 没有--maxdepth,因此它也会查找所有子目录以及*.txt文件。如果你只想$(find /home/TESTING/* -type f -name "*.txt")替换当前目录$(ls *.txt),只要你没有那个目录.txt就没有问题。

#!/bin/bash

# try cd to directory, do things upon success.
if cd /home/TESTING ;then
      # set sequence number
      let "x = 1"

      # pass every file to for that find matching, sub directories will be also as there is no maxdeapth.
      for file in $(find /home/TESTING/* -type f -name "*.txt") ; do

            # print sequence number, and base file name, processed by variable substitution. 
            # basename can be used as well but this is bash built in.
            echo "${x}${file##*/}"

            # print file content, and put sequence number before each line with stream editor.
            sed 's#^#'"${x}"'#g' ${file}

            # increase sequence number with one.
            let "x++"
      done

      # unset sequence number
      unset 'x'
else
      # print error on stderr
      echo 'cd to /home/TESTING directory is failed' >&2
fi

变量替换:

还有更多我现在只选择了这 4 个,因为它们相似。

${var#pattern}- 从左侧删除匹配模式的文本后使用 var 的值

${var##pattern}- 与上面相同,但删除最长的匹配部分而不是最短的部分

${var%pattern}- 从右侧删除匹配模式的文本后使用 var 的值

${var%%pattern}- 与上面相同,但删除最长的匹配部分而不是最短的部分

所以${file##*/}将获取 $file 的变量并*在最后一个##斜杠之前删除每个字符/$file变量值不会被这个修改,所以它仍然包含路径和文件名。

sed 's#^#'"${x}"'#g' ${file}sed 是一个流编辑器,有整本关于它的使用的书籍,对于这个特定的。它通常放在单引号中,因此's#^#1#g'将在文件中的每一行的开头添加 1。s是替换,^是文件的开头,1是文本,g是全局的,如果你不放在那里,只有第一个马赫会受到影响。 #是分隔符,也可以是其他,/例如。我刹车单引号让变量被使用并重新打开单引号。

如果你想替换一个文本,.txt 到 .php,你可以使用sed 's#\.txt#\.php#g' file,.有特殊含义,它可以替换任何单个字符,所以需要转义\,才能将其用作文本。else 不仅file.txt会匹配file1txt,也会匹配。

它可以是管道的,在这种情况下您不需要指定文件名,否则您必须提供至少一个文件名,在我们的情况下它是${file}包含文件名的变量。正如我提到的变量替换不是修改变量值,因此它仍然包含带有路径的文件名。

于 2019-04-08T21:31:22.143 回答