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