编辑:

编辑:

我有一组文件,位于./date-and-time/fixed/path/filenamedate-and-timefilename变量。我想将所有这些文件移动到./filename/date-and-time。前一个路径是文件名,前一个文件名是路径。有什么好方法可以做到这一点?总共有 ~1000 个文件,每个文件名有 ~100 个不同。

答案1

类似这样的事情应该可以工作(注意我已经echo编辑了实际的命令;在删除它们之前,请仔细检查它是否做了正确的事情)

#!/bin/bash

shopt -s nullglob

for file in */fixed/path/*; do 
  [[ -f "$file" ]] || continue
  f="${file##*/}"; d="${file%%/*}"
  echo mkdir -p "$f" && echo mv --no-clobber -- "$file" "$f/$d"
done

答案2

我假设路径的模式始终是./date-and-time/fixed/path/filename变量date-and-timefilename

date-and-time可以通过以下方式提取awk

$ echo './date-and-time/fixed/path/filename' |awk -F "/" '{print $2}'
date-and-time

filename更容易获得,因为可以通过以下方式提取basename

$ basename ./date-and-time/fixed/path/filename
filename

从这两个代码段中,可以看到一个未经测试的脚本,它在执行时会按照您描述的方式移动文件.。请在使用前进行验证。

#!/bin/bash

for i in ./*/fixed/path/*; do
    date_and_time=$(echo "$i" |awk -F "/" '{print $2}');
    filename=$(basename "$i");
    mkdir "$filename";
    mv "$i" "$filename"/"$date_and_time";
done;

答案3

像这样 :

mkdir ./filename/ && mv ./date-and-time/path/to/path-to-your-folder/* ./filename/date-and-time

编辑

如果您需要创建更多文件夹,我建议制作如下脚本:

在开始之前,我真的建议您备份要执行此操作的文件夹。

cd 进入您尝试操作的文件夹,然后:

for file in *; do
  if [[ -f "$file" ]]; then
    mkdir "${file%.*}"
    mv "$file" "${file%.*}"
  fi
done
  1. 循环遍历当前文件夹中的所有文件(*)。
  2. 从不带扩展名的文件 ${file%.*} 创建文件夹(mkdir)
  3. 将文件移动(mv)到该文件夹​​中。

相关内容