2016-04-15 2 views
2

Все файлы находятся в одной папке. Имена файлов выглядят следующим образом:Копирование файлов на основе значения метки времени в имени файла

1695_6892_00000_20160321235959.file.name.csv.gz 

Третья подстрока (после второго _) является меткой времени.

Как скопировать все файлы с помощью timestamp < 20150531000000 в другую папку my_folder?

ответ

3

Попробуйте это:

for i in *.gz; do test `echo $i | cut -d _ -f 3` -lt 20150531000000 && cp $i my_folder; done 
+0

Спасибо Жюльен :) – Dennis

+0

@Dennis Добро пожаловать. :) –

+2

Upvote для того, чтобы не использовать 'ls' и вместо этого правильно использовать шаблон оболочки. – tripleee

0

И ... Вы можете использовать AWK.

for i in $(ls -1 org_folder | awk -F"_" '{ if ($3 < 20150531000000) print $0 }'); cp mv org_foler/$i my_folder/; done 
+0

просто fyi: ls не нуждается в -1, если только вы не смотрите на него. ls знает, когда он не отображается и не форматируется в столбцах – tomc

+1

@tomc @ han056 Не используйте вывод 'ls' для чего-либо. 'ls' - инструмент для интерактивного просмотра метаданных каталога. Все попытки анализа вывода 'ls' с кодом нарушены. Globs намного проще и правильнее: 'для файла в * .txt'. Прочитайте [Parsing ls] (http://mywiki.wooledge.org/ParsingLs) –

+0

IC благодарит за консультацию – han058

-1

ls | awk -F'_' '$3<20150531000000{print}' должны быть файлы, которые вы хотите переместить, так for f in "$(ls|awk -F'_' '$3<20150531000000{print}')"; do mv "${f}" elsewhere/ ;done

Смежные вопросы