1 (14.04.2012 10:26:23 отредактировано valet)

В линуксе пока начинающий, возникла такая возникла задача: нужно скопировать все файлы из заданных нескольких каталогов (например A, B, C) в один другой каталог (D).
Не было бы никаких проблем, но имена файлов в каталогах A, B, C пересекаются, то есть например во всех трех каталогах могут быть разные файлы тем самым именем - например x, и все эти файлы мне нужно получить в каталоге назначения то есть в D.

Просто через cp сделать не получится, так как будет происходить замена файла.

Имена файлов меня вообще не интересуют, мне главное получить в каталоге D все файлы, которые находятся в А+B+C.

Помогите разобраться в элементарном вопросе - как это сделать?

2 (14.04.2012 10:39:26 отредактировано Fat-Zer)

я бы что-нить такое сделал:

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

а можно просто к концу каждого файла приписать название директории...

95% процентов проблем находятся между клавиатурой и стулом.

3

Кажется не работает.

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'

4

моя ошибка...

Fat-Zer пишет:

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

95% процентов проблем находятся между клавиатурой и стулом.

5

Подправил скрипт.

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

Работает как часы. Большое спасибо за помощь, никогда бы до такого не додумался.