Вы можете сделать это примерно так:
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
номер пациента, затем строим имя каталога и перемещаем в него файл.
С 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 . Будьте осторожны, вы не перезапишете файлы с тем же именем файла при переходе по пути назначения.
parent="$PWD"
for dir in *; do
test -d "$dir" || continue
pushd "$dir" || continue
mv -i -- * "$parent"
popd
rmdir "$dir"
done