web-dev-qa-db-ja.com

パイプコマンドの最後に新しい行を取得する方法

指定されたディレクトリのすべてのサブディレクトリのリストを出力するコマンドのパイプシーケンスを記述し、新しい行に続いて1行で出力します。

次のコマンドの出力をすべて同じ行にし、最後に新しい行を作成するのに問題があります。

これは私のパイプコマンドです:

ls -l /share/ |grep ^d |tr -s ' ' |cut -f9 -d' '| tr '\n' ' ' 

そして、出力を次のようにしたいです:

file1 file3
[user@linux]$

ではなく(私が実際に得るもの:

file1 file3[user@linux]$
1
user2953423

ディレクトリ名のみを取得したい場合は、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
heemayl

どうですか:

ls -l $/share/ |grep ^d |tr -s ' ' |cut -f9 -d' '| tr '\n' ' ' && echo " "
3
Julen Larrucea

最も簡単な解決策は、引数のないプレーンな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' ' ')
1
Byte Commander

なぜlsgrepcut、...?

awkfindを使用します。

find /usr/share -maxdepth 1 -type d | awk -F/ '{printf "%s ",$NF} END {print ""}'
1
A.B.

指定されたディレクトリのすべてのサブディレクトリのリストを出力するコマンドのパイプシーケンスを記述し、新しい行に続いて1行で出力します。

そのためにコマンドのパイプシーケンスは必要ありません。 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
%
1
kos