查找,复制,重命名和复制到此文件夹

第一次海报让我轻松哈哈哈哈。

初学者linux用户,开始使用bash脚本并希望制作一个脚本来扫描我的电视节目文件夹for fanart.jpg(每个节目都有这个文件)创建一个副本,重命名它(据我所知,unix systmes不会自动重命名文件或允许一个目录中具有相同名称的文件),并复制到壁纸文件夹。

我阅读了大量文章,似乎无法找到一种相对简单的方法。

到目前为止,我所得到的只有:

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

这给了我在各自文件夹中的所有fanart.jpg文件的列表。

我曾尝试过几个不同的东西,比如sed mvcp但似乎无法让它运转起来。

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

任何帮助将不胜感激。

干杯!

以下是用户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;find1开始编号之前。


这是一个更复杂的bash脚本,它使用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 

参考文献:

  • while循环只处理ssh命令的第一个条目

  • 递归bash脚本,用于收集有关目录结构中每个文件的信息