Linux 列出目录及其文件,并将它们分组到一行以进行标记化
我想在bash脚本中将目录名与其文件分组。 例如,如果我键入Linux 列出目录及其文件,并将它们分组到一行以进行标记化,linux,bash,shell,terminal,Linux,Bash,Shell,Terminal,我想在bash脚本中将目录名与其文件分组。 例如,如果我键入ls/home/maindir/* 我得到home/maindir/dir1:file1 file2\n file3 home/maindir/dir2:file1 file2 带有文件的目录没有用指定的分隔符分隔,因为在某些情况下,同一目录中的file1和file2之间有一个换行符,所以我想用分隔符将目录名及其文件列表标记在一行上。 使用换行分隔符的输出示例: home/maindir/dir1: file1 file2 file3\
ls/home/maindir/*
我得到home/maindir/dir1:file1 file2\n file3
home/maindir/dir2:file1 file2
带有文件的目录没有用指定的分隔符分隔,因为在某些情况下,同一目录中的file1和file2之间有一个换行符,所以我想用分隔符将目录名及其文件列表标记在一行上。
使用换行分隔符的输出示例:
home/maindir/dir1: file1 file2 file3\n
home/maindir/dir2: file1 file2\n
home/maindir/dir3: file1 file2 file4\n
我最初使用了一个无引号的插值技巧。 例如,如果文件中有字符串,每行一个,并且希望将其水平化,则不必使用“粘贴”- 名为foo的文件:
a
b
c
然后你可以说:
echo $(<foo)
但这可能会导致文件名出现问题,特别是如果它们嵌入了特殊字符或空格
感谢Gordon Davidson的简单升级
for d in /home/maindir/* # includes full path each time
do [[ -d "$d" ]] || continue # ignore nondirectories
cd "$d" # go there to make filenames path-bare
echo "$d:" *
done
请注意,这仍然包括子目录。你需要跳过这些吗?
如果你想更加小心的话-
for d in /charter/apps/*
do [[ -d "$d" ]] || continue
cd "$d"
dir="$d: "
hit=0
for f in *
do if [[ -f "$f" ]]
then hit=1
dir="$dir $f "
fi
done
(( $hit )) && printf "$dir\n"
done
这一个应该也适用于带有嵌入空格的文件&c.这实际上是最终目标,还是仅仅是你想要解析的东西来做其他事情?因为你所描述的是可能的,但是有点混乱;如果你真的只想把它解析成其他形式,可能有更好的方法。堆栈溢出不是一种代码编写服务。请出示你的密码。由于堆栈溢出对您隐藏了关闭原因:寻求调试帮助的问题(“为什么此代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:。如果目录名带有空格(或制表符或…),文件名带有通配符等,这将遇到问题。最好引用所有变量引用,设置
nullglob
,并使用echo“$d:*”
获取文件列表。如果变量可以是路径,则还应引用变量。这意味着您需要在if
语句中引用$d
,当您运行cd
时。我知道没有子目录,也没有带通配符或空格的文件名。这仍然是一个很好的策略,除非您有很好的具体理由避免它。@Robertseam[[]
不需要引用,所以[[-d$d]
即使在$d
中有空格或全局字符,也无法实现盈亏平衡。不过,引用并没有什么坏处。
for d in /charter/apps/*
do [[ -d "$d" ]] || continue
cd "$d"
dir="$d: "
hit=0
for f in *
do if [[ -f "$f" ]]
then hit=1
dir="$dir $f "
fi
done
(( $hit )) && printf "$dir\n"
done