我正在尝试更改父目录中包含的所有文件的第一行,以使它们继承其所在目录的路径名。 例如,我有一个文件,格式为:
2000-01-18
星期二
利文斯顿
42178
这个特定文件位于一个名为18的目录中,另一个位于名为01的目录中,另一个位于名为2000的目录中,另一个位于名为filesToSort的目录中。
我设法将此代码用作控制台命令来更改文件的第一行:
perl -pi -w -e 's/2000-01-18/Test/g;' ff_1177818640
这将文件更改为
测试
星期二
利文斯顿
42178
我是否可以更改此命令中的“日期”以选择所有日期,所以我尝试这样使用它:
perl -pi -w -e 's/*/Test/g;' ff_1177818640
但是一点都不喜欢。
我目前的处理过程是,如果我可以使此命令选择初始输入中的所有日期,那么一些方法将找到一种方法来将路径名实现到第二部分,该部分我目前使用的是“测试”:
path=/filesToSort/2000/01/18/ff_1177818640
file=$(basename "$path")
从理论上讲,我应该能够通过父目录和所有子目录运行整个代码,因此可以更改这些目录中文件中每个日期的值(该文件出现在每个文件的第1行)以镜像文件路径他们所在的位置,有效地打开了一个看起来像这样的文件:
2000-xx-18
星期二
利文斯顿
42178
包含在目录/ filesToSort / 2000/01/18中 进入这个:
2000/01/18
星期二
利文斯顿
42178
我不确定我是否在这里错误地使用了sed命令,是否应该使用另一个命令来代替,但是我一直试图使它工作4个小时,而我可以似乎没办法。 预先感谢您的帮助!
答案 0 :(得分:0)
在我看来,您要做的基本上是将“-”转换为“ /”。您可以找到文件,对其进行备份(总是一个好主意),然后使用:
sed 's|-|/|g' <path/backup_file >path/modified_file
也就是说,如果分配相同,则可以使用该命令将其复制到新目录并同时修改文件。
答案 1 :(得分:0)
您尚未发布sed命令,因此很难知道什么会起作用。让我们一步步来做。试试这个:
sed -i '1s/^/X/' ff_1177818640
,然后查看是否修改了文件(在第一行的开头添加“ X”)。如果您的sed版本不满意,请尝试以下操作:
sed -i "" '1s/^/X/' ff_1177818640
一旦语法生效,我们必须解决将路径转换为日期的问题。试试这个:
echo some/path/filesToSort/2000/01/18/ff_1177818640 | sed 's|.*/filesToSort/||; s|/[^/]*$||'
如果产生“ 2000/01/18”,请发表评论,然后我们可以将其放在一起。
编辑:。 Abracadabra!
find . -type f -exec sed -i "1{s|.*|{}|;s|.*/filesToSort/||;s|/[^/]*$||;}" {} \;