[英]How to extract specific parts of the path and filename in linux
我当前的任务是将多个目录中的许多文件重命名为不同的标识符。
所以我有几个目录,例如:b01,b02,b03等。每个目录中都有文件名,例如img01.23495.png,img01.3596596.png,img02.2399495.png等。
我必须将b01的img01重命名为其他标识符。 因此,标识符取决于目录名称和文件名的第一部分。
我对管道的想法是:获取所有png文件名,提取其所在的文件夹,提取img ##部分,然后将信息存储到文件中,因此我将得到一个类似以下内容的文件:
b01 img01
b01 img02
b02 img01
...
这很有用,因此我可以在后记中指定新标识符作为第三列,然后读入文件以执行实际的重命名。
目前,我有./images/something/b01/img01.2342394.png之类的路径。
为了获得列表,我目前正在尝试类似find . | grep png | something sed | sort | uniq > indentifiers.txt
find . | grep png | something sed | sort | uniq > indentifiers.txt
但是,我被困在sed
部分。 同样,欢迎提出任何建议来做我想做的事情。
find . -name "*.png" | sed 's#^.*/\([^/]*\)/\([^/.]*\)\.[0-9]\+\.png$#\1 \2#' | sort -u
对不起,我不能得到完整的测试-我在工作和停留在OSX,里面有奇怪的sed
问题。 无论如何,解决方案的核心(使用-name
测试进行find
和-u
标志进行sort
)是sed正则表达式。 您似乎有能力,但是如果有人发现它,我将解释整个过程:
s - Search and Replace
# - Delimiter (Search pattern)
^ - Beginning of a line
. - Any character
* - zero or more times
/ - a literal '/'
\( - start a capturing group
[^/]* - Any character except '/', zero or more times
\) - End capturing group (#1)
/ - a literal '/'
\( - start a capturing group
[^/.]* - Any character except '/' or '.', zero or more times
\) - End capturing group (#2)
\. - a literal '.'
[0-9] - a digit
\+ - one or more times
\.png - a literal '.png'
$ - end of the line
# - Delimiter, now starting the replace pattern
\1 - the contents of the first capturing group
- a space
\2 - the contents of the second capturing group
# - Delimiter. End of all patterns.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.