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

问题描述 投票:0回答:1

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

我尝试使用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 - print,rename,maxdepth不起作用

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

linux bash unix ksh sequential-number
1个回答
2
投票

如果在脚本中执行cd,则应该有安全失败。如果不这样,您可以在错误的目录中执行命令。

在你的尝试中,即使没有for循环,输出也是相同的,因为for file in home/TESTING只将home/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的变量并在最后一个*斜线##之前放下每个caracter /$file变量值未被此修改,因此它仍包含路径和文件名。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.