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

Unix: extract a part of the filename and rename the file with the new name

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

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

我想使用 UNIX 命令更改目录中的所有文件名。重命名文件时,我想删除 "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

不确定您认为 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

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

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