bash 无法从文本文件中找到目录 [重复]
Posted
技术标签:
【中文标题】bash 无法从文本文件中找到目录 [重复]【英文标题】:bash is unable to find directories from text file [duplicate] 【发布时间】:2022-01-18 19:19:08 【问题描述】:bash 超级新手
我编写了一个 bash 脚本,它可以在一个 MAC 上完美运行,但不能在不同的 MAC 上运行。
代码在主题文件夹中迭代循环,复制数据,执行某些功能,删除复制的数据,然后移动到下一个主题。为此,我调用了一个包含主题名称的文本文件,它通知脚本选择相应的主题文件夹(在下面的代码中使用变量 $mri_path
)。
问题是,在这个新的 MAC 上 - 脚本无法使用文本文件找到主题的文件夹 - 错误代码:文件/目录不存在。 MAC 之间的主要区别在于所使用的文本文件——它包含不同的主题名称。我可以对脚本进行硬编码以查找主题的文件夹,所以这让我怀疑文本文件没有被正确读取。
我尝试了不同的文本文件格式(例如,unicode、Macintosh 格式、制表符分隔)...所以我不知道为什么脚本找不到主题文件夹。
精简代码:
#!/bin/bash
#usage: ./dcm2nii_batch.sh subj.txt startline endline
s1=$(($2-1))
s2=$(($3-1))
vars=($(awk -F= 'print$1' subj.txt));
for ((i=s1; i<s2; i++));
do mri_path=$vars[$i]);
echo $mri_path;
echo '***';
cd /Users/syschaef/Desktop/dcm2nii_batch/Raw/$mri_path
由于cd
命令失败,错误出现在最后一行。
文本文件数据是与主题文件夹名称/目录相对应的主题标识号(屏幕截图):
感谢您抽出宝贵时间阅读和/或回复!
【问题讨论】:
旁注:整个最后一个循环可以替换为rm */*.dcm
你能减少脚本只保留导致错误的部分吗?我不明白错误到底发生在哪里,或者“使用文本文件查找主题文件夹”是什么意思。
@BenjaminW。感谢您的回复! 1)我减少了代码-它现在以失败的“更改目录”命令结束。 2)“使用文本文件查找主题文件夹”是指脚本调用包含主题名称的文本文件,通知脚本选择与主题对应的特定文件夹。例如,脚本将调用文本文件的第一行“主题 1”,然后打开名为“主题 1”的文件夹;循环的下一次迭代将调用文本文件“subject 2”的下一行,然后打开名为“subject 2”的文件夹
文本文件的内容是什么?路径中有空格吗?尝试添加足够的信息,以便任何人都可以通过问题中的内容重现问题 (minimal reproducible example)。
我怀疑您的文本文件中可能存在 Windows 行尾(带有回车符,\r\n
而不仅仅是 \n
)。在运行脚本之前,在文件上尝试dos2unix
。此外,要逐行读取文件,请查看 BashFAQ/001 和 Looping through the content of a file in Bash
【参考方案1】:
脚本包含语法错误,这就是我推荐 https://www.shellcheck.net/ 的原因。
subj.txt
可能包含在您的屏幕截图中不可见的字符。
尝试xxd subj.txt
并与有效的进行比较。
您也可以使用修复文件
dos2unix subj.txt
如果有 Windows 行结束。
在做某事之前检查潜在的问题
d="/Users/syschaef/Desktop/dcm2nii_batch/Raw/$mri_path"
if [[ ! -d "$d" ]]
then
printf 'ERROR: %d not a directory\n' "%d" >&2
exit 1
fi
cd "$d"
【讨论】:
感谢迭戈!我以前从未看过十六进制转储。这两个文件有区别。有效的文本文件 [我认为] 是一个小数点的分隔符,而无效的文件在主题名称之间有两个小数点。我在有效的文件中手动输入了主题名称,但是对于不起作用的文件,我使用了这个脚本,因为在文本文档中手动输入的主题太多:for d in ./*;do [[ -d "$d" ]] && echo "$d" >> subj.txt;完成 @jackxxd
将非打印字符显示为“.
”;您应该查看相应的十六进制列表以了解这些字符实际上是什么。我的猜测是,非工作文件具有 DOS/Windows 样式的行尾,除了 unix 期望的换行符(0a
)外,它还有一个回车符(十六进制 0d
)。见"Are shell scripts sensitive to encoding and line endings?"
dos2unix
工作-感谢您的解决方案(和详细的解释@GordonDavisson)以上是关于bash 无法从文本文件中找到目录 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Bash:由“文本在找到匹配引用之前结束”引起的“无法解析参数”[重复]