2016-03-16 4 views
0

Есть ли какая-либо команда, которая скопирует все файлы, кроме последнего файла временной метки из одного каталога в другой в Unix.Unix scipt для копирования всех файлов, кроме последнего файла timestamp

Dir1 - file1, file2, file3, file4 (новая метка времени)

ф к Dir2 - file1, file2, file3 и я не хочу file4, как это новый файл в Dir1.

ответ

0

Для получения последнего файла вы можете использовать конструкцию ls -1tr | tail -1.

Затем скопируйте файлы, за исключением последних.

Если список файлов обычно довольно короткий, этот код можно изменить , чтобы создать список файлов, а затем сделать копию - это было бы более эффективно.

dir2="../somewhereelse" 
exception=$(ls -1tr | tail -1) 
for fn in *; do 
    if [[ $fn == $exception ]]; then 
    continue 
    fi 
    cp "$fn" "$dir2" 
done 
+0

[Вы не должны полагаться на команду ls] (http://mywiki.wooledge.org/ParsingLs), чтобы дать вам информацию синтаксически анализируемого. Кроме того, вы всегда должны указывать свои переменные при их использовании. Наконец, вы не проверяете, где находятся подкаталоги. – miken32

+0

Зачем «на» не полагаться? Пожалуйста, объясните, что команда cp действительно должна быть процитирована. –

+0

В моем комментарии есть ссылка. Короче говоря, вы были бы удивлены, какие символы действительны в именах файлов. – miken32

0
#!/bin/bash 
dir1=/first/dir 
dir2=/second/dir 

# first loop through and find oldest file 
# http://mywiki.wooledge.org/BashFAQ/003 
unset -v newest 
for file in "$dir1"/*; do 
    [[ -f "$file" ]] && [[ "$file" -nt "$newest" ]] && newest="$file" 
done 

# then loop through and perform actions on the others 
for file in "$dir1"/*; do 
    if [[ -f "$file" ]] && [[ ! "$file" == "$newest" ]]; then 
     cp -p "$file" "$dir2" 
    fi 
done 
+0

Вам не нужны кавычки в '[[]]'. См. Руководство по bash. –

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