如何在管道命令末尾获取新行

如何在管道命令末尾获取新行

我想编写一个管道命令序列,打印出给定目录的所有子目录的列表,并在一行中打印,跟在新行后面。

我很难让以下命令的输出全部位于同一行,然后在末尾有一个新行。

这是我的管道命令:

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
%

相关内容