查找、复制、重命名并复制到此文件夹

查找、复制、重命名并复制到此文件夹

第一次发帖所以对我宽容点哈哈。

初级 Linux 用户,开始使用 bash 脚本并想编写一个脚本来扫描我的电视节目文件夹以查找 fanart.jpg(每个节目都有此文件)创建一个副本,重命名它(据我所知,unix 系统不会自动重命名文件或允许一个目录中有相同名称的文件),并复制到壁纸文件夹。

我读过大量的文章,但似乎找不到一个相对简单的方法来做到这一点。

到目前为止我得到的是:

cd /mnt/TV\ Shows/

find /mnt/TV\ Shows/ -name fanart.jpg

它为我提供了各自文件夹中所有 fanart.jpg 文件的列表。

在此之后,我尝试了几种不同的方法sed mvcp但似乎无法使其发挥作用。

目标文件夹是/mnt/Wallpapers/Slideshow/

任何帮助都将不胜感激。

干杯!

答案1

以下是用户的示例脚本find,其输出通过管道传输到while循环:

find "/mnt/TV Shows/" -type f -name "fanart.jpg" | while IFS= read -r item; do
    NAME="${item##*/}"
    echo cp "$item" "/mnt/Wallpapers/Slideshow/${NAME%.*}-$((i++)).${NAME##*.}"
done
  • 删除echo执行该操作。

  • 目标文件的名称将由以下部分组成:

    ${name of source file}-$((sequential number))-${extension of source file}
    
  • 编号将从 开始0,因为变量$i尚未预先初始化。您可以将 放在i=1;之前find以从 开始编号1


这里更加复杂脚本使用globstart选项**在文件夹中递归搜索文件。如果巧合,则文件将被复制到目标文件夹。您可以通过更改脚本的内部(if-fi)部分来选择不同的目标文件名模式。

#!/bin/bash

INPUT_PATH="/mnt/TV Shows"
INPUT_FILE_NAME="fanart.jpg"
OUTPUT_PATH="/mnt/Wallpapers/Slideshow"

shopt -s globstar

for item in "${INPUT_PATH}"/**; do
    # If the item is a file and its name is equal to the INPUT_FILE_NAME
    if [[ -f "$item" && "${item##*/}" == "$INPUT_FILE_NAME" ]]; then
        # Compose OUTPUT_FILE name based on the parent directory name
        INPUT_FILE_FULL_PATH="${item%/*}"
        INPUT_FILE_PARENT_DIR="${INPUT_FILE_FULL_PATH##*/}"
        OUTPUT_FILE_NAME="${INPUT_FILE_NAME%.*}-${INPUT_FILE_PARENT_DIR}.${INPUT_FILE_NAME##*.}"
        # Remove 'echo' to execute the command !!!
        echo cp "${item}" "${OUTPUT_PATH}/${OUTPUT_FILE_NAME}"
    fi
done

参考:

相关内容