迭代目录中的文件,根据文件名创建文件夹并将文件移动到相应的文件夹中

迭代目录中的文件,根据文件名创建文件夹并将文件移动到相应的文件夹中

我想将目录中的文件移动到同名文件夹中。我想使用命令行或 bash 脚本完成所有这些操作

#!/bin/bash

for  f in $1; do
  mv "$f".* <not sure what do do>
done

我如何获取文件的名称并创建文件夹?

答案1

据我了解,您打算提供一个目录名称作为 shell 脚本的第一个参数。该目录中的文件将被移动到该目录的子目录中,这些子目录的名称与文件相同,但省略了扩展名。在这种情况下:

#!/bin/bash    
for f in "$1"/*
do
    [ -d "$f" ] && continue
    base=${f%.*}
    mkdir -p "$base"
    mv "$f" "$base/"
done

怎么运行的:

  • [ -d "$f" ] && continue

    为了避免递归,这将跳过 的子目录$1

  • base=${f%.*}

    这将为 shell 变量分配一个base名称为 的变量,$f并删除其扩展名。这是删除后缀

  • mkdir -p "$base"

    这确保该目录$base存在。

  • mv "$f" "$base/"

    这会将文件移动到目录。

答案2

答案正在建设中,请耐心等待:)

工作原理

创建一个名为的文件makeDirs.sh,将下面的脚本复制到文件中,保存,然后使用以下命令使脚本可执行chmod +x /path/to/makeDirs.sh

运行任何脚本前记得备份

使用您想要操作的目录作为命令行参数来调用脚本。演示

脚本

#!/bin/bash

OPERATINGDIR="$1"
mkdir "$OPERATINGDIR/TMP"

find "$OPERATINGDIR" -maxdepth 1 -type f  | while IFS= read  FILE
do

  printf " operating on $FILE. Moving to TMP dir\n"
  mv "$FILE" "$OPERATINGDIR/TMP" 

  FULLBASENAME="$(basename "$FILE" )"
  CROPPEDBASENAME="$( basename "$FILE" | awk -F'.' '{ for(i=1;i<NF;i++) printf $i FS }' )"

  printf "Cropped basename is %s\n Full basename %s\n" "$CROPPEDBASENAME" "$FULLBASENAME"

# test if we have basename-directory made
  [ -d "$OPERATINGDIR"/"$CROPPEDBASENAME"  ] || mkdir "$OPERATINGDIR"/"$CROPPEDBASENAME" && printf "created "$OPERATINGDIR"/"$CROPPEDBASENAME" "

  printf "Moving $FILE from TMP folder to "$OPERATINGDIR"/"$CROPPEDBASENAME" \n"
  mv "$OPERATINGDIR"/TMP/"$FULLBASENAME" "$OPERATINGDIR"/"$CROPPEDBASENAME"

printf "\n\n"
done

相关内容