bash、特定の制限について「ls」を動作させる方法は? [閉鎖]

bash、特定の制限について「ls」を動作させる方法は? [閉鎖]

lsスイッチに含まれていない奇妙な制限(--max-depth=他のツールなど)がたくさんあるようです。私は共通の標準を維持するのが好きです(したがってls最もll一般的なディストリビューションの標準に従います)、他のエイリアスは覚えやすい構文(lls「長いリスト、安全」など)に従います。私はこれをいくつかの異なる質問に分けることができますが、これはすべてこれを行う一般的な方法を見つけるための努力に関連しているので、私が何を言うかを説明するために何をlsすべきかをリストするのがより適切であると感じました。彼らはすべて関連しています。いくつかの具体的な質問:

  • 私はしばしば人々がループなどlsで使用してはいけないと言うのを聞きます。forこれは基本的にサブディレクトリの表示方法などの面で意味がありますが、サブディレクトリ内を見ないようにls簡単にクリップする方法はありますか?ページに似た内容を見ることはできませんが、lsサブディレクトリにクリップしない場合は、ループや他の構造で使用するのが安定しているようです。出力を1つのディレクトリに切り取り、forループで使用する安定した方法はありますか?--max-depth=manlsforls

  • 私はやや薄暗いと思われるlld(ディレクトリ付きの長いリスト)と(ファイル付きの長いリスト)構造を使用しました。llf「ただファイルを見たい」と言うより良い方法はありますか?または「目次だけ見たいのですが?」と言うとmanページに何も表示されません。特に、-lこのリストは形式でのみ実行できます。それ以外の場合は、表示したくない項目をクリーンアップできません。一般的に言って、このようにgrepを使うのはおそらく(ロック形式のために-l)悪い考えだと思います。それでは、grepを使用する代わりにディレクトリエントリのみを選択するか、ファイルのみを選択するより良い方法はありますか?

  • 以下の他の方法のうち、間違った形式がある場合は、より良い方法を知りたいです。

標準出力セットを試してみてくださいls(設定は通常配布によって異なります)。

文字[]セットワイルドカード。たとえば、は、、、、とls name[03][17].c一致し、範囲も許可します。name01.cname07.cname31.cname37.c[]ls name[07][1-9].c

\lsを使用してbareコマンドを実行するには、エイリアスを無視します。

項目に -Fインジケータ(その1つ)を接続します。*/=>@|color=alwayscolor=auto

ls再帰の面では非常に厄介です。ls *フラグがなくても、すべてのサブフォルダが表示され、-Rすべてls c*のフォルダが表示されます。c

lsfor i in ls予測できないため、a内でanの出力を使用しないでください。

エイリアスであいまいな操作をしたくないので、広く使用されているls設定llに従いl、別のタスクに別のエイリアスを追加するだけです。

  • [[ $(type ls) == *"aliased"* ]] && then unalias lsalias:必須ではありませんが、通常はアクションをとるためのテストタイプです。

  • 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つの可能な代替案は次のとおりです。file1file2

alias lx="find . -maxdepth 1 -executable -type f"
alias lnox="find . -maxdepth 1 -type f ! -executable"

28のエイリアスリストを見ることは簡単なQ&Aの範囲をはるかに超えていますが、これが出発点として機能するはずです。解析は忘れてls安全に実行できないため、エイリアスを使用する必要がfindありstatます。

関連情報