Удалить часть имени файла в нескольких подкаталогах - PullRequest
0 голосов
/ 18 октября 2019

Основная папка «Main» содержит несколько подпапок (6900,159, 9997, ...), и каждая подпапка содержит 8 элементов (4 файла (6900Log.final.out, 6900Log.out, 6900Log.progress.out, 6900SJ).out.tab), 3 папки (6900_STARgenome, 6900_STARpass1, 6900_STARtmp) и один сжатый файл (6900Aligned.sortedByCoord.out.bam)). 6900_STARtmp содержит дополнительные подпапки, но я не хочу менять имя подпапок, присутствующих в 6900_STARtmp. См. Изображение

see Image

Я хочу удалить 6900 из (6900Aligned.sortedByCoord.out.bam, 6900Log.final.out, 6900Log.out,6900Log.progress.out, 6900SJ.out.tab) и 6900_ из (6900_STARgenome, 6900_STARpass1, 6900_STARtmp)

Чтобы имена файлов были (Aligned.sortedByCoord.out.bam, Log.final.out, Log.out, Log.progress.out, SJ.out.tab, STARgenome, STARpass1, STARtmp).

Я попытался запустить приведенный ниже скрипт на ubntu (18.04.3 LTS), чтобы переименовать SJ. out.tab и планировал сделать это для остальных файлов, но у меня это не сработало:

for filename in Main/*/*SJ.out.tab; do 
    #echo $filename
    describer=$(echo ${filename})        
    #mv "$filename" "${filename//${describer}/SJ.out.tab}"
done

Любая помощь будет высоко оценена.

1 Ответ

1 голос
/ 18 октября 2019

Чтобы убедиться, что вы случайно не изменили другие файлы или каталоги, вы должны убедиться, что ваш скрипт ограничен ТОЛЬКО файлами , начинающимися с тех же цифр, что и имя каталога или каталоги, начинающиеся с номера иподчеркивание, и только один слой глубиной.

Попробуйте это:

#!/bin/bash

declare    base_dir=/path/to/Main

cd ${base_dir}
while read subdir; do
  number=${subdir#./}
  for file in $(find ${subdir} -maxdepth 1 -type f -name "${number}*"); do
    mv ${file} ${subdir}/${file##./${number}/${number}}
  done
  for file in $(find ${subdir} -maxdepth 1 -type d -name "${number}_*"); do
    mv ${file} ${subdir}/${file##./${number}/${number}_}
  done
done < <(find . -maxdepth 1 -type d -regex './[0-9]*')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...