ls
スイッチに含まれていない奇妙な制限(--max-depth=
他のツールなど)がたくさんあるようです。私は共通の標準を維持するのが好きです(したがってls
最もll
一般的なディストリビューションの標準に従います)、他のエイリアスは覚えやすい構文(lls
「長いリスト、安全」など)に従います。私はこれをいくつかの異なる質問に分けることができますが、これはすべてこれを行う一般的な方法を見つけるための努力に関連しているので、私が何を言うかを説明するために何をls
すべきかをリストするのがより適切であると感じました。彼らはすべて関連しています。いくつかの具体的な質問:
私はしばしば人々がループなど
ls
で使用してはいけないと言うのを聞きます。for
これは基本的にサブディレクトリの表示方法などの面で意味がありますが、サブディレクトリ内を見ないようにls
簡単にクリップする方法はありますか?ページに似た内容を見ることはできませんが、ls
サブディレクトリにクリップしない場合は、ループや他の構造で使用するのが安定しているようです。出力を1つのディレクトリに切り取り、forループで使用する安定した方法はありますか?--max-depth=
man
ls
for
ls
私はやや薄暗いと思われる
lld
(ディレクトリ付きの長いリスト)と(ファイル付きの長いリスト)構造を使用しました。llf
「ただファイルを見たい」と言うより良い方法はありますか?または「目次だけ見たいのですが?」と言うとman
ページに何も表示されません。特に、-l
このリストは形式でのみ実行できます。それ以外の場合は、表示したくない項目をクリーンアップできません。一般的に言って、このようにgrepを使うのはおそらく(ロック形式のために-l
)悪い考えだと思います。それでは、grepを使用する代わりにディレクトリエントリのみを選択するか、ファイルのみを選択するより良い方法はありますか?以下の他の方法のうち、間違った形式がある場合は、より良い方法を知りたいです。
標準出力セットを試してみてくださいls
(設定は通常配布によって異なります)。
文字[]
セットワイルドカード。たとえば、は、、、、とls name[03][17].c
一致し、範囲も許可します。name01.c
name07.c
name31.c
name37.c
[]
ls name[07][1-9].c
\ls
を使用してbareコマンドを実行するには、エイリアスを無視します。
項目に
-F
インジケータ(その1つ)を接続します。*/=>@|
color=always
color=auto
。
ls
再帰の面では非常に厄介です。ls *
フラグがなくても、すべてのサブフォルダが表示され、-R
すべてls c*
のフォルダが表示されます。c
。
ls
for i in ls
予測できないため、a内でanの出力を使用しないでください。
エイリアスであいまいな操作をしたくないので、広く使用されているls
設定ll
に従いl
、別のタスクに別のエイリアスを追加するだけです。
[[ $(type ls) == *"aliased"* ]] && then unalias ls
alias
:必須ではありませんが、通常はアクションをとるためのテストタイプです。alias ls='\ls --color=always --group-directories-first
':l
ほとんどのディストリビューションで一般的なコンテンツを印刷しますls
(つまり、ファイルは表示されません.*
!)。\
コマンドが復元される前に、コマンドがエイリアスではなく形式に復元されることに注意してください。alias l='ls -AFh --color=always --group-directories-first'
:使用-A
(ほとんどすべて、および./
無視../
するが、すべてのファイルを表示し、ほぼ常にファイルを見たい場所に.*
配置)ls
.*
alias la='ls -Ah'
:長い形式(-AFh
また-l
):l
上記のエイリアスは、フラグなしでlsバーを実行するために使用されます\ls
(主に削除-A
)。alias ll='ls -lAh'
:長い形式(-AFh
また-l
):上記のエイリアスはl
フラグなしでそのまま\ls
実行するためのものですls
(-A
ほとんど削除)。
alias l.='ls -d .*' # Explicitly list just .* files, so ./ and ../ are shown, overriding the A flag
alias ls.='ls -d .*' # Explicitly list just .* files, so ./ and ../ are shown, overriding the A flag, long format
alias ll.='ls -dl .*' # Explicitly list just .* files, so ./ and ../ are shown, overriding the A flag, long format
alias lld='ls -FlA | grep :*/' # Only directories
alias llf='ls -FlA | grep -v "/"' # Only files (broken as will show symlinks etc, if have to use `/`, then `/$` would be better, but using grep at all is probably not optimal)
alias ldot="ls -ld .??*" # Dotfiles only
alias lx="ls -FlA | grep *" # Executable files only, below 'lxext' is just trying to find 'executable-like' files by their extension
alias lnox="ls -FlA | grep -v *" # Everything except executable files
alias lxext='ll *.sh *.csh *.ksh *.c *.cpp *.py *.jar *.exe *.bat *.cmd *.com *.js *.vbs *.wsh *.ahk *.ps1 *.psm1 2> /dev/null' # List possible executables and scripts by extensions, discarding error output (as will generate for every type that is not there)
alias lext='ls -Fla | egrep "\."' # Files without extensions only ".|/"
alias lnoext='ls -Fla | egrep -v "\."' # Files without extensions only
alias lsp='find . -maxdepth 1 -perm -111 -type f' # List executable by permissions. ls -lsa | grep -E "[d\-](([rw\-]{2})x){1,3}" https://stackoverflow.com/q/7812324
alias lsum="ls -Fla \$1 \$2 \$3 \$4 \$5 | awk '{ print; x=x+\$5 } END { print \"total bytes = \",x }'" # ls on required info then awk will sum the sizes
alias lll='ls --human-readable --size -1 -S --classify' # Long-list with just size and name and total size summary line
alias lm='ls -Am'; alias lcsv='lm' # comma separated view (-m), -A almost all, except '.' and '..'
alias lsz='ls -lAshSr'; alias lsize='lsz' # -s size, -h human readable, -S by size, -r reverse so largest are easily visible at end
alias lt='ls -lAth' ; alias ltime='lt'; alias ldate='lt'; alias lst='lt' # sort by -t time/date, human readable
# replicate 'ls', but using 'stat' to show both normal 'ls' permission flags *and* octal.
lsec() { if [ -z "$@" ]; then args='. .*'; else args="$@"; fi; stat --printf="%A\t%a\t%h\t%U\t%G\t%s\t%.19y\t%n\n" $args; }; alias lstat='lsec';
lperm() { if [ -z "$@" ]; then args='. .*'; else args="$@"; fi; stat --printf="%A %a %n\n" $args; }; # Just permissions, %A (ls format), %a (Octal format) and names
sanitize() { chmod -R u=rwX,g=rX,o= "$@" ;} # Make directory and file access rights the same
alias 000='echo "---------- (Owner -, Group -, and Other -)"; chmod 000' # Remove permissions: append with file/directory to apply to
alias 644='echo "-rw-r--r-- (Owner rw, Group r, and Other r)"; chmod 644' # Onwer rw, everyone else read-only
alias 755='echo "-rwxr-xr-x (Owner rwx, Group r-x, and Other r-x)"; chmod 755' # Make executable, but only Owner has write permissions
alias mx='chmod a+x' # Make Executable
alias lls='lss' # Since the 'stat' output is in long format 'll', also use 'lls' for 'long listing with ecurity'
alias sl='ls' # Common typo, also just overwrite the 'Steam Locotomive' toy if present, as that gets boring
alias lg='exa -lG' # 'ls grid', exa is an interesting potential successor to 'ls', in Ubuntu 20.10 repo by default, colours each permission item and -lG is a useful 2x column long view.
if grep -qEi "(Microsoft|WSL)" /proc/version &> /dev/null; then
for d in /mnt/[a-z]; do [ -d /mnt/$(basename ${d}) ] && alias "$(basename ${d}):"="cd $d"; done # "d:" => cd to /mnt/d
for d in /mnt/[a-z]; do [ -d /mnt/$(basename ${d}) ] && alias "l$(basename ${d}):"="cd $d && ll"; done # "ld:" => cd to and list d:""
fi
答え1
使用に関する一般的なアドバイスはループls
に関するものではありませんfor
あらゆるタイプの出力の解析ls
。これには、奇妙なファイル名ls | grep
(改行やグローバル文字を含むファイル名など)が原因でほぼ確実に失敗するエントリが含まれます。注意深く読んでくださいhttps://mywiki.wooledge.org/ParsingLsそしてなぜ`ls`を解析しないのですか*(そしてどうすればいいですか?)。
要点は、ループや他の構文解析ls
でそれを使用したくない理由は、for
サブディレクトリとは関係がなく、ls
結果を表示する方法に関連していることです。つまり、ls
(少なくともGNU ls
、Linuxのデフォルト値)サブディレクトリに入れないようにするフラグがあります。
-d, --directory
list directories themselves, not their contents
例えば:
$ tree
.
├── dir1
│ ├── file1
│ ├── file2
│ └── file3
└── dir2
├── file1
├── file2
└── file3
2 directories, 6 files
今比較してみてください:
$ ls *
dir1:
file1 file2 file3
dir2:
file1 file2 file3
そして
$ ls -d *
dir1 dir2
すでにいくつかのエイリアスで使用されています。
lsd
エイリアシングに関してはlsf
そうです。おっしゃったように、これは不正で奇妙なファイル名でも失敗します。ディレクトリのみをリストする「標準」方法は次のとおりです。
ls -d */
基本ファイルだけをインポートする方法がわかりませんls
。何らかの理由で本当に必要な場合は、次のものを使用できますfind
。
find . -maxdepth 1 -type f
通常ls
、スクリプトではなく人間のために設計されています。したがって、解析が必要な場合は、常により良いツールがあります。通常find
またはstat
。
これらのエイリアスのいくつかは、ユーザーが念頭に置いているものと一致しません。たとえば、次のようになります。
alias lx="ls -FlA | grep *" # Executable files only, below 'lxext' is just trying to find 'executable-like' files by their extension
alias lnox="ls -FlA | grep -v *" # Everything except executable files
エイリアスは引用符なしでエイリアスを生成するため、*
シェルはgrep
エイリアスを表示する前に拡張します。したがって、2つのファイルを含むディレクトリがある場合:
$ ls
file1 file2
これはlx
実際に実行されます。
ls -FlA | grep file1 file2
*
ディレクトリの内容に展開されるため、結果としてエイリアスは完全に無視され、grepを使用してファイル内の文字列をfile1 file2
見つけます。ls
これら2つの可能な代替案は次のとおりです。file1
file2
alias lx="find . -maxdepth 1 -executable -type f"
alias lnox="find . -maxdepth 1 -type f ! -executable"
28のエイリアスリストを見ることは簡単なQ&Aの範囲をはるかに超えていますが、これが出発点として機能するはずです。解析は忘れてls
安全に実行できないため、エイリアスを使用する必要がfind
ありstat
ます。