有人非常聪明(有点讽刺吗?)在他们自己的目录中提取了超过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
...
答案 0 :(得分:0)
您可以在所有这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)
答案 1 :(得分:0)
这应该可以解决问题。比anubhava的脚本简单一点,但如果只是移动文件和删除dirs,那么它仍然是唯一的内容。
for x in *; do
if [[ $(find "$x" | sed 1d | head -n2) == "$x/$x.txt" ]]; then
mv "$x/$x.txt" . && rmdir "$x"
fi
done
您可以将其剪切粘贴到父目录中的命令行。它遍历该目录中的所有文件(for x in *
),如果它们中的任何一个本身只是一个包含单个文件$x/$x.txt
的目录,那么它将移动该文件并删除该目录。
答案 2 :(得分:0)
这是我的剧本,基于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
答案 3 :(得分:-1)
您可以在父目录中使用一行代码执行此操作:
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
如果需要,您还可以在移动文件后测试目录是否为空 - 在删除目录之前。的显示的强>