我想要复制最近创建的目录中的文件。在 Unix 中该如何实现?
例如,如果我的目录名称是日期时间戳:
/20110311
/20110318
/20110325
我想要复制最近创建的目录中的文件。在 Unix 中该如何实现?
例如,如果我的目录名称是日期时间戳:
/20110311
/20110318
/20110325
我认为你在询问的问题的答案就是这个。
当我处理许多带有日期/时间戳的目录时,我总是采用你提到的方法,即 YYYYMMDD - 这么做的好处是日期顺序也是字母顺序。在大多数 shell(肯定包括 bash,其他的我90%确定)中,“*” 的展开是按字母顺序完成的,而默认情况下 'ls' 返回的也是字母顺序。因此
ls | head -1
ls | tail -1
给出目录中最早和最晚的日期。
可以扩展为仅保留最后5个条目等。
ls | tail -2
- jdamaelastdir=`ls -tr <parentdir> | tail -1`
我不知道如何让反引号与这里的评论系统兼容。只需将那些单引号替换为反引号即可。
find -type d -exec stat -t {} \; | sort -r -n -k 13,13
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.
回到您最初的请求,要复制文件,可以尝试以下方法。要输出仅一个目录(即最新的),请将此附加到命令中(注意初始管道符),并使用反引号将所有内容馈入您的“cp”命令以执行复制。
| head --lines=1 | sed 's/\ .*$//'
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}'
- 按日期排序目录并输出最近修改的名称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]}";
ls
的输出了。(尽管,在这种特定情况下使用YYYYMMDD
名称应该没问题。)sh
中尝试吗? - janmoesen${#foo}
计算名为 foo
的普通(字符串)变量中字符的数量,${foo[@]}
计算名为 foo
的数组中元素的数量。请参阅 Bash 参数扩展。 - janmoesenfind ~ -type d | ls -ltra
这是我最近学到的一个简单而有用的命令。 该命令将以相反的时间顺序显示结果。
我写了一个命令,可以用来识别哪个文件夹或文件是作为最新创建的。这似乎很纯粹 :)
#/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
find
命令吗? - jdamae