В линуксе пока начинающий, возникла такая возникла задача: нужно скопировать все файлы из заданных нескольких каталогов (например A, B, C) в один другой каталог (D).
Не было бы никаких проблем, но имена файлов в каталогах A, B, C пересекаются, то есть например во всех трех каталогах могут быть разные файлы тем самым именем - например x, и все эти файлы мне нужно получить в каталоге назначения то есть в D.
Просто через cp сделать не получится, так как будет происходить замена файла.
Имена файлов меня вообще не интересуют, мне главное получить в каталоге D все файлы, которые находятся в А+B+C.
Помогите разобраться в элементарном вопросе - как это сделать?
LinuxForum.Fans
Копирование файлов с условием
Автор: valet
5 сообщений
1487 просмотров
я бы что-нить такое сделал:
text
for I in A/* B/* C/*; do
TRGT=$(basename $I)
if [ -e "D/$TRGT" ]; do
J=1
while [ -e "D/${TRGT}_$J" ]; do
J=$(( $J +1))
done
TRGT="${TRGT}_$J"
fi
cp $I D/$TRGT;
done
а можно просто к концу каждого файла приписать название директории...
Кажется не работает.
text
valet@valet-debian:~/Документы$ mkdir A
valet@valet-debian:~/Документы$ mkdir B
valet@valet-debian:~/Документы$ mkdir C
valet@valet-debian:~/Документы$ echo "a" > A/x
valet@valet-debian:~/Документы$ echo "b" > B/x
valet@valet-debian:~/Документы$ echo "c" > C/x
valet@valet-debian:~/Документы$ mkdir D
valet@valet-debian:~/Документы$ vim script
записал в файл:
#!/bin/bash
for I in A/* B/* C/*; do
TRGT=$(basename $I)
if [ -e "D/$TRGT" ]; do
J=1
while [ -e "D/${TRGT}_$J" ]; do
J=$(( $J +1))
done
TRGT="${TRGT}_$J"
fi
cp $I D/$TRGT;
done
valet@valet-debian:~/Документы$ chmod +x script
valet@valet-debian:~/Документы$ ./script
./script: line 5: syntax error near unexpected token `do'
./script: line 5: ` if [ -e "D/$TRGT" ]; do'
моя ошибка...
for I in A/* B/* C/*; do
TRGT=$(basename $I)
if [ -e "D/$TRGT" ]; then
J=1
while [ -e "D/${TRGT}_$J" ]; do
J=$(( $J +1))
done
TRGT="${TRGT}_$J"
fi
cp $I D/$TRGT;
done
Подправил скрипт.
text
valet@valet-debian:~/Документы$ ./script
valet@valet-debian:~/Документы$ ls D
x x_1 x_2
valet@valet-debian:~/Документы$ cat D/x
a
valet@valet-debian:~/Документы$ cat D/x_1
b
valet@valet-debian:~/Документы$ cat D/x_2
c
Работает как часы. Большое спасибо за помощь, никогда бы до такого не додумался.
Войдите или зарегистрируйтесь, чтобы ответить.