繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM