2015-02-27 2 views
0

Я не так хорошо знаком с скриптом linux ... и должен был сделать что-то странное.Как выбрать один файл из списка, который появляется после файла «x» в алфавитном порядке

У меня есть простой каталог, который имеет множество папок в формате ГГГГММДД ... вот как это выглядит, когда я делаю Ls в каталоге

[админ @ ххх аудит] $ Ls

1145 20140827 20140828 20140829 20140830 20140831 20140901 20140902 20140903 20140904 20140905 20141020 20141021 20141022 20141023 20141024 20141025 20141026 20141027 20141028 20141029 20141030 20141031 nohup.out

Теперь то, что я должен сделать, это скопировать одну папку (в порядке возрастания) в другой каталог. Я сохраню имя папки, скопированную где-нибудь на моем диске.

Теперь мне нужно скопировать папку, которая появляется после того, который был скопирован ранее и так далее.

например. Я скопировал сначала 1145 в пункт назначения и сохранил его в файле last_copied_date.txt. Теперь в следующем прогоне мне нужно прочитать last_copied_date.txt для этого имени папки, а затем с 20140827 подходит к 1145, скопируйте его в пункт назначения и замените имя в last_copied_date.txt на это имя новой скопированной папки.

Опять же, в третьем тираже 20140828 будет скопирован (помните, что 1145 и 20140827 все еще существует в исходной папке) и last_copied_date.txt будут обновлены.

Любая помощь приветствуется.

+0

Когда вы говорите «папка» - вы имеете в виду «файл» или «каталог»? В UNIX нет папок, просто файлов и каталогов, и обычно, когда кто-то говорит «папка», это человек Windows, который означает каталог, но вы конкретно говорите о каталогах в своем вопросе, поэтому неясно, что вы подразумеваете под «папкой». –

ответ

1

В этом ответе я предполагаю, что ваш каталог не изменяется между итерациями (т. Е. Ни один из ваших имен папок не будет добавлен/удален/изменен).

Давайте сначала определим функцию, которая считывает last_copied_date.txt и копирует его в destination:

Инициализация проста, мы хотим сделать ls и получить только первую строку:

init(){ ls|head -n 1 >$1; } 

шаг итерации немного сложнее, так как нам нужно найти «следующий шаг после» один прямо сейчас и поместить его в last_copied_date.txt, это можно сделать легко через grep и tail.

next(){ ls|grep -A 1 $(cat $1)|tail -n 1 > last_copied_date.txt; } 

Таким образом, вы можете теперь собрать все вышеперечисленное в одной функции:

iteration() { 
if [[ -a $1 ]] ; 
    then next $1; 
    else init $1; 
fi 
read_and_copy $1; 
} 
0

Вы можете создать ниже скрипт на пути источника и сделать то же самое. То, что я понял из вашего примера ниже, будет делать то же самое.

foldernamelist.txt должен содержать все имя папки, которую вы хотите переместить.

Вы можете использовать нижеследующий код, чтобы создать.TXT файл:

ls -d */ | sed -e "s/\///g" > foldernamelist.txt 

Сценарий:

for foldername in `cat foldernamelist.txt` 
do 
    echo $foldername > last_copied_date.txt 
    cp $foldername /destination_path 
done 

Позвольте мне знать, если вы обнаружите какие-либо вопросы.