我想将目录中的文件移动到同名文件夹中。我想使用命令行或 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