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;完成 @jack xxd 将非打印字符显示为“.”;您应该查看相应的十六进制列表以了解这些字符实际上是什么。我的猜测是,非工作文件具有 DOS/Windows 样式的行尾,除了 unix 期望的换行符(0a)外,它还有一个回车符(十六进制 0d)。见"Are shell scripts sensitive to encoding and line endings?" dos2unix工作-感谢您的解决方案(和详细的解释@GordonDavisson)

以上是关于bash 无法从文本文件中找到目录 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Bash:由“文本在找到匹配引用之前结束”引起的“无法解析参数”[重复]

从 Web 服务器上的文本文件中读取文本 [重复]

python:删除重复的文本行组

通过 Bash 从文本文件中删除空行,包括空格字符 [重复]

通过bash从文件中找到最大的数字[重复]

利用Linux命令行进行文本按行去重并按重复次数排序