Удалите / переместите файлы, которые во всех отношениях имеют одинаковые имена, за исключением того, что для одного набора добавлен определенный префикс - PullRequest
0 голосов
/ 20 октября 2019

У меня есть большой набор рабочих файлов вида a.mp4 b.txt c.avi d.doc и т. Д. (Расширение не имеет отношения к вопросу). У меня также есть набор файлов, которые включают в себя файлы с одинаковыми именами, за исключением общего префикса «broken_», например broken_a.mp4, broken_b.txt

Если у меня есть a.mp4 и broken_a.mp4, я хочупереместить broken_a.mp4 в каталог хранения. Если у меня есть broken_d.mp4, но нет соответствующего d.mp4, оставьте его в покое.

У меня есть некоторый код, успешно используемый для идентификации и перемещения файлов с тем же расширением, которое я хотел бы изменить

Это форма рабочего примера кода для файлов с теми же расширениями (спасибоавтор, который я хотел бы изменить, если это возможно, чтобы выполнить эту работу

#!/bin/bash                                                                                                                                                                                                                                                                      

# Name of source directory                                                                                                                                                                                                                                                       
SOURCE_DIR=.

# Name of destination directory                                                                                                                                                                                                                                                  
DEST_DIR=already_converted_m4v

# Create the destination directory for the moved files, if it doesn't already exist.                                                                                                                                                                                             
[ ! -d $DEST_DIR ] && mkdir -p $DEST_DIR

find $SOURCE_DIR -maxdepth 1 -type f -iname "*.avi"  | while read fin
do
#echo "m4v doing avi"                                                                                                                                                                                                                                                            
  fm4v=${fin/.avi/.m4v}
 [ -f "$fm4v" ] && gmv -v --backup=numbered "$fin" $DEST_DIR/
done

Моя первая попытка сбора мусора, которая явно не работает, выглядит ужасно:

#!/bin/bash                                                                                                                                                                                                                                                                      

# Name of source directory                                                                                                                                                                                                                                                       
SOURCE_DIR=.

# Name of destination directory                                                                                                                                                                                                                                                  
DEST_DIR=Already_broken

# Create the destination directory for the moved files, if it doesn't already exist.                                                                                                                                                                                             
[ ! -d $DEST_DIR ] && mkdir -p $DEST_DIR

find $SOURCE_DIR -maxdepth 1 -type f -iname "*"  | while read fin
do
#echo "working to find existing broken and unbroken files"                                                                                                                                                                                                                       
  filetest_basename=$(basename "$fin" )
  filetest_extension=$(extension "$fin" )
echo $filetest_basename
echo $filetest_extension
  fileok=${filetest_basename/!broken_/broken_}
 [ -f "$fileok" ] && gmv -v --backup=numbered "$fin" $DEST_DIR/
done

Благодарен за помощь

1 Ответ

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

find здесь не имеет значения, достаточно простого цикла оболочки:

SRCDIR='.'
DSTDIR='Already_broken'

if ! [ -d "$DSTDIR" ]; then
    mkdir -p -- "$DSTDIR"
fi

for broken in "$SRCDIR"/broken_*; do
    if [ -f "${broken%"${broken##*/}"}${broken##*/broken_}" ]; then
        echo gmv -v --backup=numbered "$broken" -- "$DSTDIR"
    fi
done

Если его вывод выглядит хорошо, удалите echo.

Некоторые примечания:

  • Мы не можем использовать ${broken/broken_} здесь, поскольку SRCDIR может содержать broken_ в будущем.
  • Вложенный PE (${broken##*/}) необходимо заключить в кавычки, поскольку его результат может содержать метасимволыи это приведет к нежелательным результатам.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...