私のフォルダparent
には次のコンテンツがあります:
A.Folder B.Folder C.File
内部にはフォルダとファイルの両方があります。 B.Folder
は新しいです。 B.Folder
を取得したいのですが、どうすれば達成できますか?私はこれを試しました、
ls -ltr ./parent | grep '^d' | tail -1
drwxrwxr-x 2 user user 4096 Jun 13 10:53 B.Folder
が得られますが、B.Folder
という名前が必要です。
これを試して:
$ ls -td -- */ | head -n 1
-t
オプションはls
を変更時間でソートし、新しいものが最初になります。
削除する場合は/
:
$ ls -td -- */ | head -n 1 | cut -d'/' -f1
ls -td -- ./parent/*/ | head -n1 | cut -d'/' -f2
Herson's solution との違いは、*
の後ろのスラッシュです。これにより、シェルはすべての非dirファイルを無視します。 Gnouc との違いは、別のフォルダにいる場合に機能します。
末尾の「/」を削除するには、Cutが親ディレクトリの数(2)を知っている必要があります。それがない場合は、
VAR=$(ls -dt -- parent/*/ | head -n1); echo "${VAR::-1}"
必須のzsh回答:
latest_directory=(parent/*(/om[1]))
括弧内の文字は glob qualifiers :/
はディレクトリのみを照合し、om
は年齢を上げることで照合をソートし、[1]
最初の(つまり最新の)一致のみを保持します。 N
のサブディレクトリがない場合に空の配列を取得する場合(通常は1要素の配列を取得する場合)は、parent
を追加します。
または、parent
にシェルグロビング文字が含まれていないと仮定します。
latest_directory='parent/*(/om[1])'; latest_directory=$~latest_directory
Zshがなくても、最近のGNUツール(つまり、非組み込みLinuxまたはCygwin))がある場合は、find
を使用できますが、面倒です。ここに1つの方法があります。
latest_directory_inode=$(find parent -mindepth 1 -maxdepth 1 -type d -printf '%Ts %i\n' | sort -n | sed -n '1 s/.* //p')
latest_directory=$(find parent -maxdepth 1 -inum "$latest_directory_inode")
ls
を使用した簡単な解決策があります。これは、ディレクトリ名に改行または(一部のシステムでは)印刷できない文字が含まれていない限り機能します。
latest_directory=$(ls -td parent/*/ | head -n1)
latest_directory=${latest_directory%/}
できるよ:
ls -td -- ../parent/* | head -n 1
次のコマンドは、ディレクトリ名にスペースが含まれている場合でもジョブを実行します。
cp `find . -mindepth 1 -maxdepth 1 -type d -exec stat --printf="%Y\t%n\n" {} \; |sort -n -r |head -1 |cut -f2'`/* /target-directory/.
バックティックの内容の更新された説明は次のとおりです。
.
-現在のディレクトリ(ここで絶対パスを指定することもできます)-mindepth/-maxdepth
-現在のディレクトリの直接の子にのみfindコマンドを制限します-type d
-ディレクトリのみ-exec stat ..
-修正時間とディレクトリの名前を、スペースではなくタブで区切られたfindから出力しますsort -n -r |head -1 | cut -f2
-日付はディレクトリを並べ替え、最後に変更された名前全体を出力します(デフォルトの区切り文字のタブとしてスペースが含まれている場合でも)