如何在每个文件名以及目录中文件内容的每一行中添加顺序编号,例如1,2,3等?

时间:2019-04-08 09:28:28

标签: linux bash unix ksh sequential-number

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

我尝试使用maxdepth,重命名,打印功能作为一部分。但会引发错误,提示“ -maxdepth”-不是有效的选项。

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

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

P.s-打印,重命名,最大深度无效

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

1 个答案:

答案 0 :(得分:2)

如果在脚本中执行cd,应该有故障保护功能。否则,您可以在错误的目录中执行命令。

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

我使用了不带--maxdepth的find,因此它也将查找*.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.具有特殊含义,它可以替换任何单一字符,因此需要转义{{ 1}},将其用作文本。否则,不仅\将被匹配,file.txt也将被匹配。

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