Bash 脚本,从目录中的一组文件中读取
Bash script, reading from set of files in a directory
我在一个目录中放置了一组文件,我想从每个文件中读取第二行,提取放在大括号“ () ” 之间的第一个子字符串,并用这个替代重命名该文件。
我不是在寻找完整的 bash 代码,我只需要一些提示和命令用于每个步骤
示例:
一个文件有这些行:
/* USER: 202166 (just_yousef) */
/* PROBLEM: 2954 (11854 - Egypt) */
/* SUBMISSION: 11071978 */
/* SUBMISSION TIME: 2012-12-25 15:49:25 */
/* LANGUAGE: 3 */
我需要获取子字符串“11854 - Egypt”并用它重命名文件,然后继续下一个文件。
对目录中的每个使用与 xargs 相同的管道并过滤您要读取的文件。并将带有路径的文件名传递给将读取第二行的脚本。
对于脚本,打开文件并按照逻辑提取字符串 a。
然后关闭文件并使用重命名命令重命名您作为此脚本输入的文件名。
重命名 $0 .txt
如果文件结构是递归的,则提取最后一个之前的名称/使用字符串方法的索引。
看起来 sed
可能是完成这项工作的工具:
for i in *
do
j=`sed -e '1d;2{;s/.*(\(.*\)).*//;q;}' "$i"`
test -z "$j" || test -e "$j" || mv -v "$i$ "$j"
done
我把 $j
空的或已经存在的测试作为保障措施;你可能会想到其他人。我还把 -v
标志给了 mv
这样你就可以看到它在做什么。
您可能更喜欢使用 sed -n
并且只对匹配 PROBLEM:
的行执行操作,如果这比始终使用第二行更可靠的话。
from each file
for f in /the/directory/*; do
# ...
done
read the second line [and] extract the first substring which is placed between [parentheses]
v=$(sed -n '2 { s/[^(]*(\([^)]*\)).*//; p; q }' < "${f}")
rename that file
使用mv
命令。
我在一个目录中放置了一组文件,我想从每个文件中读取第二行,提取放在大括号“ () ” 之间的第一个子字符串,并用这个替代重命名该文件。
我不是在寻找完整的 bash 代码,我只需要一些提示和命令用于每个步骤
示例: 一个文件有这些行:
/* USER: 202166 (just_yousef) */
/* PROBLEM: 2954 (11854 - Egypt) */
/* SUBMISSION: 11071978 */
/* SUBMISSION TIME: 2012-12-25 15:49:25 */
/* LANGUAGE: 3 */
我需要获取子字符串“11854 - Egypt”并用它重命名文件,然后继续下一个文件。
对目录中的每个使用与 xargs 相同的管道并过滤您要读取的文件。并将带有路径的文件名传递给将读取第二行的脚本。
对于脚本,打开文件并按照逻辑提取字符串 a。
然后关闭文件并使用重命名命令重命名您作为此脚本输入的文件名。
重命名 $0 .txt
如果文件结构是递归的,则提取最后一个之前的名称/使用字符串方法的索引。
看起来 sed
可能是完成这项工作的工具:
for i in *
do
j=`sed -e '1d;2{;s/.*(\(.*\)).*//;q;}' "$i"`
test -z "$j" || test -e "$j" || mv -v "$i$ "$j"
done
我把 $j
空的或已经存在的测试作为保障措施;你可能会想到其他人。我还把 -v
标志给了 mv
这样你就可以看到它在做什么。
您可能更喜欢使用 sed -n
并且只对匹配 PROBLEM:
的行执行操作,如果这比始终使用第二行更可靠的话。
from each file
for f in /the/directory/*; do
# ...
done
read the second line [and] extract the first substring which is placed between [parentheses]
v=$(sed -n '2 { s/[^(]*(\([^)]*\)).*//; p; q }' < "${f}")
rename that file
使用mv
命令。