[英]move files that have the same name of the file they contain
一个非常聪明的人(感到讽刺?)已经在自己的目录中提取了6000多个档案,但是有时档案包含一个文件:与该目录的名称相同。
例:
mydir(0001)/mydir(0001).txt
mydir(ZREZ)/mydir(ZREZ).txt
mydir(AAEZ)/mydir(AAREZ).txt
mydir(AAEZ)/otherfile.txt
mydir(QQQQ)/mydir(QQQQ).txt
...
有没有一种快速的方法(Unix shell)来比较文件(如果只有一个文件)和文件所在的目录,如果文件相同(没有扩展名),则将其移至上方一个目录并删除(现在为空)目录?
所以我应该得到:
mydir(0001).txt
mydir(ZREZ).txt
mydir(AAEZ)/mydir(AAREZ).txt
mydir(AAEZ)/otherfile.txt
mydir(QQQQ).txt
...
您可以从所有这6000个目录/文件的父目录中使用如下脚本:
while IFS= read -d '' -r d; do
n=$(find "$d" -maxdepth 1 -type f -exec echo . \; | wc -l)
f="${d}/${d}.txt"
[[ $n -eq 1 && -f "$f" ]] && mv "$f" "$d/../" && rmdir "$d"
done < <(find . -type d ! -name '.' -print0)
这应该可以解决问题。 比anubhava的脚本简单一些,但是如果唯一的内容,那就还是只移动文件并删除目录。
for x in *; do
if [[ $(find "$x" | sed 1d | head -n2) == "$x/$x.txt" ]]; then
mv "$x/$x.txt" . && rmdir "$x"
fi
done
您可以将其剪切-n-粘贴到父目录的命令行中。 它循环遍历该目录中的所有文件( for x in *
),如果其中任何一个文件本身是仅包含单个文件$x/$x.txt
的目录,则它将移动文件并删除目录。
这是我的脚本,基于Anubhava的第一个答案。 对不起初学者的风格:
#!/bin/bash
# loop & print a folder recusively,
folder_recurse() {
for i in "$1"/*;do
if [ -d "$i" ];then
n=$(find "$i" -maxdepth 1 -exec echo . \; | wc -l)
d=$(readlink -f "${i}")
g=$d"/"$(basename "$i")".epub"
if [[ $n -eq 2 && -f "$g" ]]; then
echo "Doing: $i"
mv "$g" "$d/.."
rmdir "$d"
fi
folder_recurse "$i"
done
}
# try get path from param
path=""
if [ -d "$1" ]; then
path=$1;
else
path="/tmp"
fi
echo "base path: $path"
folder_recurse $path
您可以在父目录中使用单行代码来执行此操作:
for i in */*; do [ -f "${i%/*}/${i%/*}.txt" ] && mv "$i" . && rm -d "${i%/*}"; done
由于人们一直对在rm -d
无的BSD上同样起作用的解决方案感兴趣,因此可以使用以下方法实现相同的目的:
for i in */*; do [ -f "${i%/*}/${i%/*}.txt" ] && mv "$i" . && [ -z "$(ls -A "${i%/*}")" ] && rm -r "${i%/*}"; done
然后,在mv
检查其余目录是否为空,如果是,则删除目录,否则保持目录不变。
输出:
drwxr-xr-x 2 david david 4096 Aug 25 16:20 mydir(AAEZ)
-rw-r--r-- 1 david david 0 Aug 25 16:20 mydir(0001).txt
-rw-r--r-- 1 david david 0 Aug 25 16:20 mydir(QQQQ).txt
-rw-r--r-- 1 david david 0 Aug 25 16:20 mydir(ZREZ).txt
mydir\(AAEZ\)/
-rw-r--r-- 1 david david 0 Aug 25 16:20 mydir(AAREZ).txt
-rw-r--r-- 1 david david 0 Aug 25 16:20 otherfile.txt
如果需要,您还可以在移动文件后(删除目录之前)测试目录是否为空。 所示
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.