只查找许多目录中的第一个文件

时间:2017-02-15 15:47:00

标签: bash unix awk command-line find

我有很多目录:

public class CpeController : Controller
{
    // GET: Services/Cpe
    public ActionResult Index()
    {
        return View();
    }
}

每个目录都包含大量文件:

13R
613
AB1
ACT
AMB
ANI

目的是从每个目录中获取第一个文件

我期望的结果是:

20140828.13R.file.csv.gz
20140829.13R.file.csv.gz
20140830.13R.file.csv.gz
20140831.13R.file.csv.gz
20140901.13R.file.csv.gz

20131114.613.file.csv.gz
20131115.613.file.csv.gz
20131116.613.file.csv.gz
20131117.613.file.csv.gz

20141114.ab1.file.csv.gz
20141115.ab1.file.csv.gz
20141116.ab1.file.csv.gz
20141117.ab1.file.csv.gz

etc..

从文件名中输入日期的目录名称。 我想我需要一个发现和头部命令+ awk,但我无法做到,我需要你的帮助。

这里我测试了它

13R|20140828
613|20131114
AB1|20141114

但缺少文件夹名称。

当我的意思是第一个文件时,是文件夹中按字母顺序返回的第一个文件。

感谢。

3 个答案:

答案 0 :(得分:2)

您可以使用Bash循环执行此操作。

假设:

/tmp/test
/tmp/test/dir_1
/tmp/test/dir_1/file_1
/tmp/test/dir_1/file_2
/tmp/test/dir_1/file_3
/tmp/test/dir_2
/tmp/test/dir_2/file_1
/tmp/test/dir_2/file_2
/tmp/test/dir_2/file_3
/tmp/test/dir_3
/tmp/test/dir_3/file_1
/tmp/test/dir_3/file_2
/tmp/test/dir_3/file_3
/tmp/test/file_1
/tmp/test/file_2
/tmp/test/file_3

只需遍历目录并从glob中形成一个数组并抓住第一个:

prefix="/tmp/test"
cd "$prefix"
for fn in dir_*; do 
    cd "$prefix"/"$fn"
    arr=(*)
    echo "$fn|${arr[0]}"
done

打印:

dir_1|file_1
dir_2|file_1
dir_3|file_1

如果你的定义是“第一个'与Bash不同,只是在获取第一个元素之前根据您的定义对数组arr进行排序。

您也可以使用findawk

执行此操作
$ find /tmp/test -mindepth 2 -print0 | awk -v RS="\0" '{s=$0; sub(/[^/]+$/,"",s); if (s in paths) next; paths[s]; print $0}'
/tmp/test/dir_1/file_1
/tmp/test/dir_2/file_1
/tmp/test/dir_3/file_1

然后插入sort(或使用gawk)按需排序

答案 1 :(得分:2)

sort有一个独特的选项。只有目录应该是唯一的,因此在排序-k1,1时使用第一个字段。当文件列表已经排序时,解决方案就可以工作。

printf "%s\n" */* | sort -k1,1 -t/ -u | sed 's#\(.*\)/\([0-9]*\).*#\1|\2#'

当日期字段后跟另一个数字时,您需要更改sed命令。

答案 2 :(得分:1)

这对我有用:

for dir in $(find "$FOLDER" -type d); do
  FILE=$(ls -1 -p $dir | grep -v / | head -n1)
  if [ ! -z "$FILE" ]; then
    echo "$dir/$FILE"
  fi
done