我有很多目录:
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
但缺少文件夹名称。
当我的意思是第一个文件时,是文件夹中按字母顺序返回的第一个文件。
感谢。
答案 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
进行排序。
您也可以使用find
和awk
:
$ 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