我有一个bash命令,它生成一个我需要更改文件名的文件列表。 所以我想用这样的东西:
GetProgress
问题是应该改变第二个$ 1,用sed取代一些正则表达式。 如何将sed应用于第二个参数?
我尝试使用$()和|,但它不起作用。
我也试过
mycommand | awk {mv $1 altered$1}
答案 0 :(得分:1)
mv
不是awk命令。你需要shell。尝试:
mycommand | while IFS= read -r f; do mv "$f" "${f//[^A-Za-z0-9._-]/_}"; done
这假设文件名是换行符分隔的。除非文件名包含换行符作为其名称的一部分,否则这是正常的。为了获得更好的可靠性,应修改mycommand
和while循环以使用NUL作为分隔符。
工作原理:
while IFS= read -r f; do
这会启动一个循环,依次将每一行读入变量f
。
IFS=
告诉shell将前导空格或尾随空格保留在一行上。如果mycommand
产生多余的前导或尾随空格,则删除它。
-r
告诉shell在输入中保留反斜杠。
mv "$f" "${f//[^A-Za-z0-9._-]/_}"
这会重命名文件。
done
这表示while
循环结束。
答案 1 :(得分:1)
您接受子shell吗?如果是,可以采用以下简单方法:
mv `mycommand | awk '{print $1}'` {altered$1}
答案 2 :(得分:0)
使用rename
(始终安装在基于 Debian 的发行版中,通过必需的 util-linux 包):
rename 's/^/altered/' $(mycommand)