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 如何为每个文件名以及目录中的每行文件内容添加序号,如1、2、3等?_Linux_Bash_Unix_Ksh_Sequential Number - Fatal编程技术网

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

Linux 如何为每个文件名以及目录中的每行文件内容添加序号,如1、2、3等?,linux,bash,unix,ksh,sequential-number,Linux,Bash,Unix,Ksh,Sequential Number,我想为目录中的每个文件及其内容添加序列号。序列号应以文件名作为前缀,其内容的每一行应以相同的数字作为前缀。以这种方式,应该为目录子文件夹中的所有文件(名称及其内容)生成序列号 我已经尝试使用maxdepth、rename和print函数作为一部分。但它抛出了一个错误,即“-maxdepth”-不是一个有效的选项 我已经有了一部分代码(用于打印目录中文本文件的名称和内容),应该将此逻辑附加在代码后面 #!bin/bash cd home/TESTING for file in home/TESTI

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

我已经尝试使用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
p.s-打印、重命名、最大深度不起作用


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

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

#!bin/bash
cd home/TESTING
for file in home/TESTING;
do
find home/TESTING/ -type f -name *.txt -exec basename {} ';' -exec cat {} \;
done
在您的尝试中,即使没有for循环,输出也将是相同的,因为
for file In home/TESTING
仅通过
home/TESTING
作为
for
的参数,因此它只运行一次。万一
对于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的#^#“${x}”和#g${file}
sed是一个流编辑器,关于它的用法有很多书,对于这个特殊的编辑器。它通常放在单引号中,因此
's#^ 1#g'
将在文件中每行的开头添加1。
s
是替换,
^
是文件的开头,
1
是文本,
g
是全局的,如果不放在那里,只有g第一马赫会受到影响。
#
是分隔符,也可以是其他分隔符,例如
/
。我停止使用单引号以允许使用变量,并重新打开单引号

如果您想将文本.txt替换为.php,可以使用
sed's#\.txt\.php#g'文件
具有特殊意义,它可以替换任何单个字符,因此需要对其进行转义才能将其用作文本。否则不仅会匹配
file.txt
,还会匹配
file1Text


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

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

在您的尝试中,即使没有for循环,输出也将是相同的,因为
for file In home/TESTING
仅通过
home/TESTING
作为
for
的参数,因此它只运行一次。万一
对于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的#^#“${x}”和#g${file}
sed是一个流编辑器,关于它的用法有很多书,对于这个特殊的编辑器。它通常放在单引号中,因此
's#^#1#g'
将在文件中每行的开头添加1。
s
是替换,
^
是文件的开头,
1
是文本,
g
是全局的,如果您不放置