Сценарий оболочки для копирования всех файлов в каталоге в указанную папку

Я новичок в сценарии оболочки, и я пытаюсь найти способ написать сценарий, который копирует все файлы в текущем каталоге в каталог, указанный из файла .txt, и если есть совпадающие имена, он добавляет текущую дату в форме FileName_YYYYMMDDmmss на имя копируемого файла, чтобы предотвратить перезапись.

Кто-нибудь может мне помочь?

Я видел, как думал что-то вроде

#!/bin/bash

source=$pwd          #I dont know wheter this actually makes sense I just want to
                     #say that my source directory is the one that I am in right now

destination=$1       #As I said I want to read the destination off of the .txt file

for i in $source     #I just pseudo coded this part because I didn't figure it out.   
do
   if(file name exists)
   then 
       copy by changing name
   else
       copy
   fi
done   

проблема в том, что я понятия не имею, как проверить, существует ли имя, а также скопировать и переименовать его одновременно.

Спасибо


person canecse    schedule 31.07.2013    source источник


Ответы (2)


Как насчет этого? Я предполагаю, что целевой каталог находится в файле new_dir.txt.

    #!/bin/bash

    new_dir=$(cat new_dir.txt)
    now=$(date +"%Y%m%d%M%S")

    if [ ! -d $new_dir ]; then
            echo "$new_dir doesn't exist" >&2
            exit 1
    fi

    ls | while read ls_entry
    do
            if [ ! -f $ls_entry ]; then
                    continue
            fi  
            if [ -f $new_dir/$ls_entry ]; then
                    cp $ls_entry $new_dir/$ls_entry\_$now   
            else
                    cp $ls_entry $new_dir/$ls_entry
            fi  
    done 
person wooghie    schedule 31.07.2013
comment
Я хочу передать файл .txt в качестве входных данных для программы, и я не хочу, чтобы он был жестко запрограммирован. Вы знаете, как это можно сделать? - person canecse; 01.08.2013
comment
@user2591144 замените строку new_dir=$(cat new_dir.txt) на new_dir=$(cat $1). - person wooghie; 01.08.2013

Я думаю, это то, что вы ищете:

#!/bin/bash

dir=$(cat a.txt)

for i in $(ls -l|grep -v "^[dt]"|awk '{print $9}')
do
    cp $i $dir/$i"_"$(date +%Y%m%d%H%M%S)
done

Я предположил, что a.txt содержит только имя целевого каталога. Если есть другие записи, вы должны добавить фильтр к первому оператору (используя grep или awk).

NB: я использовал отметку полного времени (ГГГГММДДЧЧммсс) вместо вашего ГГГГММДДммсс, так как это не кажется логичным.

person blackSmith    schedule 31.07.2013