我想为每个文件及其目录中的内容添加序号。序列号应以文件名作为前缀,并且其内容的每一行都应具有相同的前缀。以这种方式,应该为目录的子文件夹中的所有文件(名称和内容)生成序号。
我尝试使用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。以这种方式,它必须遍历目录中的所有子文件夹并进行相应的打印。我已经有一部分代码了,应该将此逻辑附加到其后。
答案 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
变量。正如我提到的,变量替换不是修改变量值,因此它仍然包含带有路径的文件名。