我想复制最近创建的目录中的文件。我怎么会在unix中这样做?
例如,如果我将目录名称作为日期戳,则为:
/20110311
/20110318
/20110325
答案 0 :(得分:10)
这是我认为你问的问题的答案。
当我处理名称中有日期/时间戳的许多目录时,我总是采用你拥有的 YYYYMMDD 的方法 - 最棒的是那个日期顺序是也是字母顺序。在大多数shell中(当然在bash中,我对其他shell有90%肯定),'*'扩展按字母顺序完成,默认情况下' ls '返回字母顺序。因此
ls | head -1
ls | tail -1
在目录中提供最早和最晚的日期。
这可以扩展到仅保留最后5个条目等。
答案 1 :(得分:6)
lastdir=`ls -tr <parentdir> | tail -1`
我不知道如何通过这里的评论系统使反引号发挥出色。只需用反引号替换那些撇号。
答案 2 :(得分:3)
经过一些实验,我想出了以下内容:
unix stat 命令在这里很有用。 '-t'选项使 stat 以简洁模式打印其输出(全部在一行中),该简洁输出的第13个元素是最后一个的unix时间戳(自纪元以来的秒数) - 修改时间。此命令将按照从最新修改到最旧修改的顺序列出所有目录(和子目录):
find -type d -exec stat -t {} \; | sort -r -n -k 13,13
希望 stat 的“简洁”模式在 stat 的未来版本中保持一致!
以下是对所用命令行选项的一些解释:
find -type d # only find directories
find -exec [command] {} \; # execute given command against each *found* file.
sort -r # reverse the sort
sort -n # numeric sort (100 should not appear before 2!)
sort -k M,N # only sort the line using elements M through N.
返回原始请求,要复制文件,可以尝试以下操作。要只输出一个目录( most recent),请将其附加到命令(注意初始管道),并将其全部反馈到带有反引号的'cp'命令中。
| head --lines=1 | sed 's/\ .*$//'
答案 3 :(得分:3)
基于ls的解决方案的问题在于它们不仅仅针对目录进行过滤。我想这个:
cp `find . -mindepth 1 -maxdepth 1 -type d -exec stat -c "%Y %n" {} \; |sort -n -r |head -1 |awk '{print $2}'`/* /target-directory/.
可能会做到这一点,但请注意,这只会复制直接目录中的文件。如果你想要一个更通用的答案,将你最新目录下的任何内容复制到一个新目录,我认为你最好使用rsync,如:
rsync -av `find . -mindepth 1 -maxdepth 1 -type d -exec stat -c "%Y %n" {} \; |sort -n -r |head -1 |awk '{print $2}'`/ /target-directory/
但它取决于你想要的行为。反引号中的内容的解释是:
.
- 当前目录(您可能需要在此指定绝对路径)-mindepth/-maxdepth
- 将find命令仅限制为当前目录的直接子项-type d
- 仅限目录-exec stat ..
- 从find sort -n -r |head -1 | awk '{print $2}'
- 日期命令目录并输出最近修改的答案 4 :(得分:2)
如果你的目录被命名为YYYYMMDD
,就像你的问题所示,请利用字母表格式。
将所有目录放在一个数组中,然后选择第一个:
dirs=(*/); first_dir="$dirs";
(这实际上是first_dir="${dirs[0]}";
的快捷方式。)
同样,最后一个:
dirs=(*/); last_dir="${dirs[$((${#dirs[@]} - 1))]}";
丑陋的语法,但这是它分解为:
# Create an array of all directories inside the working directory.
dirs=(*/);
# Get the number of entries in the array.
num_dirs=${#dirs[@]};
# Calculate the index of the last entry.
last_index=$(($num_dirs - 1));
# Get the value at the last index.
last_dir="${dirs[$last_index]}";
我知道这是一个老问题并且已经接受了答案,但我认为这种方法更可取,因为它在Bash中做了所有事情。没有理由产生额外的流程,更不用说parse the output of ls
了。 (诚然,在这个YYYYMMDD
名称的特殊情况下应该没问题。)
答案 5 :(得分:0)
请尝试以下命令
ls -1tr |尾巴-1
答案 6 :(得分:0)
我编写了一个命令,可用于识别文件夹中创建的最新文件夹。那似乎是纯粹的:)
#/bin/sh
path=/var/folder_name
newest=`find $path -maxdepth 1 -exec stat -t {} \; |sed 1d |sort -r -k 14 | head -1 |awk {'print $1'} | sed 's/\.\///g'`
find $path -maxdepth 1| sed 1d |grep -v $newest
答案 7 :(得分:0)
find ~ -type d | ls -ltra
这个我最近学到的很简单实用。 此命令将按逆时间顺序显示结果。