私はLinuxを初めて使用するのに助けが必要です。ファイル名とそのパスのリストを含むファイルがあります。前任者:
$ cat /home/user/files.txt
/xyz/abc/xxx/abc.sh
/xyz/nnn/111.dat
/xyz/mmm/yyy/sss/rrr/123.log
ファイル名ではなくディレクトリ構造のみを印刷する方法は、ディレクトリの深さや拡張子が一定ではないことに注意してください。
/
必要な出力(後にスラッシュは不要)
/xyz/abc/xxx/
/xyz/nnn/
/xyz/mmm/yyy/sss/rrr/
提案してください。よろしくお願いします。
答え1
cat file | while read name; do
dirname "$name"
done
答え2
最後のコンポーネントが実際にファイル名であると確信している場合は、次のものを使用できますawk
。
awk -F'/' -v OFS='/' '{$NF=""}1' file.txt
入力と出力にasフィールド区切り文字を使用/
し、最後のフィールド(ファイル名など)を空の文字列に設定します。1
ルールブロックの外部ディレクティブは、awk
すべての修正を含む行を印刷します。
または以下を使用してくださいsed
。
sed -E 's|/[^/]+$|/|' file.txt
/
"a の後にランダムな文字が続くパターンを置き換えます。いいえ行末までスラッシュを使用して、/
パスの最後の部分であるファイル名を効果的に削除します。