【问题标题】:Delete/move files which in all respects have same file name except one set has a specific prefix added删除/移动在所有方面都具有相同文件名的文件,除了一组添加了特定前缀
【发布时间】:2020-02-16 18:21:24
【问题描述】:

我有大量格式为 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

感谢帮助

【问题讨论】:

  • a.mp4broken_a.mp4 在同一个目录中吗?以某种方式可视化目录结构会使这一点更清晰
  • 文件都在同一个目录下。我当前的示例代码使用 -maxdepth 1 来限制搜索。

标签: bash prefix identify


【解决方案1】:

find 在这里无关紧要,一个简单的 shell 循环就足够了:

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##*/}),因为它的结果可能包含元字符,这会带来不希望的结果。

【讨论】:

  • 如果我必须扩展它来搜索在所有方面都具有相同文件名的文件(这次与前缀无关)但一组有一个额外的后缀“.rar”是否有简单修改代码?比如1.txt.rar和1.txt
  • @RichardL 那会更容易,只需将 if 行替换为 if [ -f "$broken.rar" ]; then
猜你喜欢
  • 1970-01-01
  • 2011-10-13
  • 2019-12-22
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
相关资源
最近更新 更多