bash - 使用特定模式重命名文件并修剪名称的其余部分 - 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 `}'
你能告诉我哪里出错了吗
解决方案
编辑:要处理文件名中的空格或换行符,请尝试以下操作。
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
推荐阅读
- codeigniter - 从支付网关重定向后,codeigniter 4 会话数据丢失
- mysql - 我可以强制 MySQL 使用磁盘内部表吗?
- tensorflow - ResNet 的 tf-slim 实现上的权重共享
- visual-studio-code - VS Code 远程 ssh:如何让进程在断开连接后继续运行完成?
- arrays - 将数组的一部分传递给 BLAS Fortran
- logging - 如何关闭 log4j2 中的 Dozer 日志记录条目?
- python - ValueError:检查输入时出错:预期 input_1 的形状为 (224, 224, 3) 但得到的数组的形状为 (3, 224, 224)
- html - 为什么带有空内联块的 div 有高度?
- angularjs - 单个组件加载缓慢的多个垫表
- .net - 使用数组绑定和 CLOB 在 Oracle 表中插入非常慢