LINUX.ORG.RU
ФорумAdmin

ДОПОМОЖИТЬ


0

0

Подскажите. Есть dir1 (lost+found) с файлами/каталогами вперемешку , есть рабочий вариант структуры каталогов dir2 - но устаревший (очень), файлов туча руками ЛЕНЬ раскладывать. Дело в том что ругается так

line 11: $file ./recreated/${\{\}%%/}: bad substitution

#!/bin/bash

TMP_IFS=`echo $IFS`

export IFS=`echo -e "\n\r"`

dir1list=(`ls -1R ./dir1`)

export IFS=$TMP_IFS

echo "" > ./log

for file in ${dir1[*]};do

echo "Searching for: $file" >> ./log

find ./dir2 -name "$file" -exec cp -v --parents $file

./recreated/_тутнадочтото_ \; >> ./log

done;

anonymous

Непонятно что нужно-то - написать в лог файл каких файлов нету в старой папке чтоли? Если да то смотреть в сторону rsync опция --dry-run

FreeBSD ★★★
()

Думаю, что не надо пытаться делать exec из find, проще сделать еще один массив, заодно так можно будет проверить, дал ли find один искомый файл или неколько, то есть, что то типа:

newfile=( `find ./dir2 -name "$file"` )
if [ ${#newfile[*]} != 1 ] ; then
echo "Files with same name"
else
cp ...
fi

Хотя я в целом не понял как вы хотели выполнять команду cp, ведь ls -1R выдает имена файлов, а не полные пути к ним, как их в таком виде давать команде cp? ИМХО, если я правильно понимаю логику вашего скрипта, то надо было делать примерно так:

Инициализация IFS
for ffile in `find ./dir1` ; do
file=${ffile##*/} # Или вызывать команду basename
newfile=( `find ./dir2 -name "$file"` )
case "${#newfile[*]}" in
0)
echo "No file with name $ffile"
;;
1)
dstdir="${newfile[0]}"
dstdir="${dstdir%/*}" # Или вызывать команду dirname
dstdir="${dstdir#./dir2}"
dstdir="./newdir/$dstdir"
[ ! -d "$dstdir" ] && mkdir -p "$dstdir"
cp -i -v $ffile "$dstdir
;;
*)
echo "Files with same name ${newfile[*]}"
esac
done

mky ★★★★★
()
Ответ на: комментарий от mky

всем спасибо, раньше отписать не мог, но решил это так:

#!/bin/bash

TMP_IFS=`echo $IFS`

export IFS=`echo -e "\n\r"`

home=(`find ./dir1`)

export IFS=$TMP_IFS

echo "" > ./log1

for file in ${home[*]};do

nfile=${file##*/} echo "Processing: $file" >> ./log1 export IFS=`echo -e "\n\r"` found=(`find ./dir2 -name "$nfile"`) export IFS=$TMP_IFS for ffile in ${found[*]};do echo "Found: $ffile" >> ./log1 if [ -d $file ];then mkdir -p ./recreated/$ffile >> ./log1 else mkdir -p ./recreated/${ffile%/*}; cp $file ./recreated/${ffile%/*}/ >> ./log1 fi done; done;

anonymous
()
Ответ на: комментарий от mky

что-то нечитабильно получилось (пардон)
всем спасибо, раньше отписать не мог, но решил это так:
#!/bin/bash
TMP_IFS=`echo $IFS`
export IFS=`echo -e "\n\r"`
home=(`find ./dir1`)
export IFS=$TMP_IFS
echo "" > ./log1
for file in ${home[*]};do
    nfile=${file##*/}
    echo "Processing: $file" >> ./log1
    export IFS=`echo -e "\n\r"`
    found=(`find ./dir2 -name "$nfile"`)
    export IFS=$TMP_IFS
    for ffile in ${found[*]};do
	echo "Found: $ffile" >> ./log1
	if [ -d $file ];then
	    mkdir -p ./recreated/$ffile >> ./log1
	else
	    mkdir -p ./recreated/${ffile%/*}; cp $file ./recreated/${ffile%/*}/ >> ./log1
	    
	fi
    done;
done;

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.