Unix:提取文件名的一部分,并使用新名称重命名该文件

时间:2017-09-09 12:07:18

标签: shell unix awk cygwin

我有一个包含csv文件列表的目录,即

short-books-for-sale.csv
old-books-for-sale.csv
random-books-for-sale-new.csv

我想使用UNIX命令更改目录中的所有文件名。重命名文件时我想删除“#34; books"”之后的所有内容。 输出看起来像这样:

short-books.csv
old-books.csv
random-books.csv

这是我到目前为止所做的,但它仍然无法正常工作。

for f in *.csv; do
awk -F'books' '{print FILENAME}' "$f";
mv "$f" "$f";
done

2 个答案:

答案 0 :(得分:2)

不确定您认为awk -F'books' '{print FILENAME}' "$f"mv "$f" "$f"会做什么,但他们实际做的是:

awk -F'books' '{print FILENAME}' "$f"

=>逐行读取文件“$ f”,在每次出现books时拆分每一行,不再做任何事情,而是为“$ f”中的每一行打印一次“$ f”值。

mv "$f" "$f"

=>尝试将文件“$ f”移动到自身。这显然会产生错误信息,因为它毫无意义。

试试这个:

for f in *books-*.csv; do
    echo mv -- "$f" "${f/books-*./books.}"
done

完成测试后删除echo,以便它变为:

for f in *books-*.csv; do
    mv -- "$f" "${f/books-*./books.}"
done

答案 1 :(得分:0)

使用prename(Perl重命名)单行(如果支持):

prename 's/books[^.]+/books/' *.csv