移动与其包含的文件具有相同名称的文件

时间:2014-08-25 21:13:12

标签: linux shell

有人非常聪明(有点讽刺吗?)在他们自己的目录中提取了超过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
...

4 个答案:

答案 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

如果需要,您还可以在移动文件后测试目录是否为空 - 在删除目录之前。的显示的