假装我的根是:
repeats
我的文件夹结构为:
foo
目录可能更深一些文件夹。
如果我有这样的根:
-foo
-123
-file.jpg
-file2.jpg
-456
-file.jpg
-file2.jpg
我如何在shell脚本中以CSV格式列出每个文件名及其路径?
我尝试了一些答案,但我很难让它输出一长串CSV。
我期待的是:
ROOT=foo
所以,我试过这个:
file.jpg,123,file2.jpg,123,file.jpg,456,file2.jpg,456
它不断为我的输出添加句点,我不相信我的递归部分也是正确的。有人可以指出我正确的方向或可能有帮助的文件吗?
我在shell脚本方面做得很少,但我正在尝试:)基本上要接受这个答案并导出到整个目录的CSV并提供带有dir路径的图像链接(相对于初始目录),便于过滤导入Excel。
答案 0 :(得分:1)
如果你有bash
GNU find
find foo -type f -printf '"%f","%h"\n' | paste -d, -s -
%f
for filename %h
用于主要目录路径paste -d, -s -
将换行符分隔的结果连接到逗号分隔的单行或BSD find
更通用的解决方案,因为它不支持-printf
选项
find foo -type f -print | sed 's|^\(.*\)/\(.*\)|"\2","\1"|' | paste -d, -s -
<强>输出强>
"file1.jpg","foo/123","file2.jpg","foo/123","file1.jpg","foo/456","file2.jpg","foo/456"
要生成快速测试用例,您可以使用
mkdir -p foo/{123,456}
touch foo/{123,456}/file{1..2}.jpg
生成类似
的目录结构foo/
├── 123
│ ├── file1.jpg
│ └── file2.jpg
└── 456
├── file1.jpg
└── file2.jpg
答案 1 :(得分:0)
既然你想要:
你可以有两个约定(基于我对你的例子的理解):
t = int(input())
for i in range (t):
n = int(input())
if (n >= 1000000007):
fact_n = 0
else:
fact_n = 1
for i in range(1,n+1):
fact_n = (fact_n * i) % 1000000007
print(fact_n)
full/folder/file , full/folder/file
假设我当前的目录 foo 如下所示:
full/folder , file , full/folder , file
然后是第一个约定:
14:37:14 ツ :foo >ls -R
sublevel1 456 123
./sublevel1:
123
./sublevel1/123:
file2.jpg file.jpg
./456:
file2.jpg file.jpg
./123:
file2.jpg file.jpg
这会给你以下结果:
#!/usr/bin/env bash
first=1
find . -type f -print0 | while IFS= read -rd '' file ; do
if [ "$first" == "1" ]; then
filestr="\"$(cut -f2- -d'/' <<< "${file}")\""
unset first
else
filestr=",\"$(cut -f2- -d'/' <<< "${file}")\""
fi
printf "%s" "$filestr"
done
如果您将"sublevel1/123/file.jpg","sublevel1/123/file2.jpg","456/file.jpg","456/file2.jpg","123/file.jpg","123/file2.jpg"
更改为-print0
,那么您将获得类似上述第二个约定的输出:
-printf "%h\0%f\0"
注意:
"sublevel1/123","file.jpg","sublevel1/123","file2.jpg","456","file.jpg","456","file2.jpg","123","file.jpg","123","file2.jpg"
格式在处理名称方面具有相当的弹性printf "%s"
块只是为了确保逗号不以第一个文件为前缀对于更强大的应用程序,请考虑序列化JSON或其他一些数据表示格式,其中可以更完整地处理列表处理。