Linux 如何为每个文件名以及目录中的每行文件内容添加序号,如1、2、3等?
我想为目录中的每个文件及其内容添加序列号。序列号应以文件名作为前缀,其内容的每一行应以相同的数字作为前缀。以这种方式,应该为目录子文件夹中的所有文件(名称及其内容)生成序列号 我已经尝试使用maxdepth、rename和print函数作为一部分。但它抛出了一个错误,即“-maxdepth”-不是一个有效的选项 我已经有了一部分代码(用于打印目录中文本文件的名称和内容),应该将此逻辑附加在代码后面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
#!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
是全局的,如果您不放置