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

Вы можете сделать это примерно так:

for file in patient*; do
 PATIENT_NO=$(echo $file | sed 's/patient_sample_.*R1_\(.*\)/\1/')
 PATIENT_DIR=patient$PATIENT_NO
 mkdir -p $PATIENT_DIR
 mv $file $PATIENT_DIR
done

Сначала вырезаем с помощью sed номер пациента, затем строим имя каталога и перемещаем в него файл.

1
25.03.2018, 18:22
2 ответа

С findи однолинейным:

find. -mindepth 2 -type f -execdir sh -c 'mv -vt../ "$@" ; rmdir "$PWD"' _ {} +
  • -mindepth 2позволит команде findигнорировать файлы текущих каталогов.
  • -execdirэто важно здесь, и это заставляет findизменить текущий каталог на каталог, в котором найден файл, и команды внутри будут выполняться в самом этом каталоге.

  • mv -vt../ "$@", это расширится доmv -vt../ "file1" "file 2" "..." "fileN"

  • rmdir "$PWD"удалит каталог, в котором находится -execdir, который запустится после того, как все файлы будут перемещены в parentDirectory .

Будьте осторожны, вы не перезапишете файлы с тем же именем файла при переходе по пути назначения.

1
27.01.2020, 23:32
parent="$PWD"
for dir in *; do
    test -d "$dir" || continue
    pushd "$dir" || continue
    mv -i -- * "$parent"
    popd
    rmdir "$dir"
done
1
27.01.2020, 23:32

Теги

Похожие вопросы