Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 列出目录及其文件,并将它们分组到一行以进行标记化_Linux_Bash_Shell_Terminal - Fatal编程技术网

Linux 列出目录及其文件,并将它们分组到一行以进行标记化

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\

我想在bash脚本中将目录名与其文件分组。 例如,如果我键入
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