首页 > 解决方案 > 使用特定模式重命名文件并修剪名称的其余部分 - bash

问题描述

我的文件具有以下名称,我试图摆脱不需要的字符,只想单独提取文件名。

文件名

          abc_xyz.file name 1.unwanted part.xls
          abc_xyz.file 2.unwanted part.xls
          abc_xyz.file name 3.unwanted part.xls
          abc_xyz.file name 4.unwanted part.csv
          abc_xyz.file 5.unwanted part.csv
          abc_xyz.file name 6.unwanted part.csv

我希望重命名我的文件,这些文件的扩展名中只有 .xls 并且具有相同的名称。

          file name 1.xls
          file 2.xls
          file name 3.xls
          abc_xyz.file name 4.unwanted part.csv
          abc_xyz.file 5.unwanted part.csv
          abc_xyz.file name 6.unwanted part.csv

我尝试使用带有 sed 和 awk 命令的 for 循环,但无法完成。这是我尝试过的。我已将要更改的文件名保存在 /tmp/dileep/files.txt 中,并使用以下命令将我想要的名称保存到不同的文件中。

          cut -d '.' -f2  < /tmp/dileep/files.txt | sed -e 's/._//g' > /tmp/dileep/names.txt

我能够得到我想要的文件名,但我无法在它们中迭代以用正确的名称重命名它们。

for i in *.xls ; do cp $i /tmp/dileep/{awk -F '.' '{print $2}' < $i | sed -e 
's/._//g'} ; done
sed: -e expression #1, char 8: unexpected `}'
cp: invalid option -- 'F'
Try `cp --help' for more information.
sed: -e expression #1, char 8: unexpected `}'
cp: invalid option -- 'F'
Try `cp --help' for more information.
-bash: $i: ambiguous redirect
sed: -e expression #1, char 8: unexpected `}'
-bash: $i: ambiguous redirect
sed: -e expression #1, char 8: unexpected `}'

你能告诉我哪里出错了吗

标签: bashawksed

解决方案


编辑:要处理文件名中的空格或换行符,请尝试以下操作。

find /tmp -type f -name "*.xls" -print0 | while IFS= read -r -d '' file;
do
   new_file=$(echo "$file" | sed 's/\(.*\/\)[^.]*\.\([^.]*\.\).*/\1\2xls/')
   echo "mv \"$file\" \"$new_file\""
done

上面将在终端上打印命令,运行它们并重命名文件,一旦你对上面感到满意。

find /tmp -type f -name "*.xls" -print0 | while IFS= read -r -d '' file;
do
   new_file=$(echo "$file" | sed 's/\(.*\/\)[^.]*\.\([^.]*\.\).*/\1\2xls/')
   echo "mv \"$file\" \"$new_file\"" | sh
done

另外以find/tmp为例,请根据您的需要将其更改为完整路径。



请您尝试以下操作。

for file in *.xls
do
   new_file=$(echo "$file" | sed 's/[^.]*\.\([^.]*\.\).*/\1xls/')
   echo "mv \"$file\" \"$new_file\""
done

到目前为止,mv一旦您感到高兴,它只会在终端上打印(重命名文件的命令),然后您可以运行以下代码。

上面命令的示例输出很少,如下所示。

mv "abc_xyz.file 2.unwanted part.xls" "file 2.xls"
mv "abc_xyz.file name 1.unwanted part.xls" "file name 1.xls"
mv "abc_xyz.file name 3.unwanted part.xls" "file name 3.xls"


仅当您对上述命令的结果感到满意时才运行以下命令,因为这将重命名文件。

for file in *.xls
do
   new_file=$(echo "$file" | sed 's/[^.]*\.\([^.]*\.\).*/\1xls/')
   echo "mv \"$file\" \"$new_file\"" | sh
done

推荐阅读