我有一组文件,位于./date-and-time/fixed/path/filename
和date-and-time
是filename
变量。我想将所有这些文件移动到./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-time
和filename
。
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
- 循环遍历当前文件夹中的所有文件(*)。
- 从不带扩展名的文件 ${file%.*} 创建文件夹(mkdir)
- 将文件移动(mv)到该文件夹中。