我想编写一个管道命令序列,打印出给定目录的所有子目录的列表,并在一行中打印,跟在新行后面。
我很难让以下命令的输出全部位于同一行,然后在末尾有一个新行。
这是我的管道命令:
ls -l /share/ |grep ^d |tr -s ' ' |cut -f9 -d' '| tr '\n' ' '
我希望输出如下:
file1 file3
[user@linux]$
而不是(我实际得到的是:
file1 file3[user@linux]$
答案1
关于什么:
ls -l $/share/ |grep ^d |tr -s ' ' |cut -f9 -d' '| tr '\n' ' ' && echo " "
答案2
似乎您只想获取目录名称,如果是的话,您可以使用find
:
find /share -maxdepth 1 -type d -printf '%f\n'
例子:
% find /usr -maxdepth 1 -type d -printf '%f\n'
usr
include
lib
share
sbin
local
bin
games
lib32
src
原始答案:
使用类似智能外壳zsh
或者使用printf
:
printf '%s\n' "$(ls -l /share/ |grep ^d |tr -s ' ' |cut -f9 -d' '| tr '\n' ' ')"
看一眼help printf
。
答案3
最简单的解决方案就是echo
在命令末尾添加一个不带任何参数的普通命令:
ls -l $/share/ |grep ^d |tr -s ' ' |cut -f9 -d' '| tr '\n' ' ' ; echo
如果你不喜欢用 链接的命令;
,你也可以使用:
echo $(ls -l $/share/ |grep ^d |tr -s ' ' |cut -f9 -d' '| tr '\n' ' ')
答案4
我想编写一个管道命令序列,打印出给定目录的所有子目录的列表,并在一行中打印,跟在新行后面。
你不需要管道命令序列;你可以使用 Bash 的文件名扩展顺便说一句,您需要一个管道命令序列来实现这一点,因为显然您不想打印尾随的“/”:
echo */ | tr -d '/'
echo */
:打印*/
,这是一个通配符模式,它扩展到当前工作目录中以 结尾的任何文件夹/文件/
(因此仅限于文件夹);tr -d '/'
: 删除尾随的“/”。不必担心“/”会出现在文件名中,因为“/”不是文件名的有效字符。
% mkdir dir{1..3}
% touch file{1..3}
% tree
.
├── dir1
├── dir2
├── dir3
├── file1
├── file2
└── file3
3 directories, 3 files
% echo */ | tr -d '/'
dir1 dir2 dir3
%