从 bash 中的文件中读取图像名称后将其移动到单独的目录中

从 bash 中的文件中读取图像名称后将其移动到单独的目录中

我正在尝试从文件文本中读取图像的名称rgb_train_ids.txt,然后在读取图像名称后将其移动到新文件夹Train

#!/bin/bash

for file in $(cat rgb_train_ids.txt); do 
     mv "$file.png" "Train"; 
done

当我执行上述 bash 脚本时,它只会移动第二张图像img_2并显示以下内容:

mv: cannot stat 'img_1'$'\r''.png': No such file or directory

我注意到,它总是移动文件文本的最后一行。
我不知道问题出在哪里,你能帮帮我吗?

在此处输入图片描述

答案1

表示$'\r'rgb_train_ids.txt具有 DOS 样式的行尾,由 2 个字符序列 CRLF 组成。Linux 要求文件仅使用 LF。您可以使用实用程序转换文件,或者使用或dos2unix删除 CR 字符。trsed

另外,使用循环遍历行for file in $(cat rgb_train_ids.txt)是一种不好的做法 - 如果行中包含空格或其他 shell 特殊字符,它将失败。您应该考虑使用循环while

while IFS= read -r file; do
  mv "$file.png" Train/
done < <(tr -d '\r' < rgb_train_ids.txt)

尾随的/onTrain/是一种安全措施,如果目录不存在,它将导致mv命令出错- 而不是无意中重命名每个文件。或者,您可以使用来明确说明Trainmv -t Train "$file.png"Train目标目录

也可以看看

您还可以考虑使用xargs而不是 shell 循环:

tr -d '\r' < rgb_train_ids.txt | xargs -d '\n' mv -t Train

相关内容