我想重命名一个以枚举方式命名的文件。我以前的方法是使用此命令行:
FILES=`ls "someDir/"`; for f in $FILES; do echo "Processing file: $f"; done;
Echoing
文件名仅用于演示目的。以上产生了预期的输出:
Processing file: File1
Processing file: File2
Processing file: File3
...
然而,当我运行(我认为是同样的事情)下面的脚本时,它将整个ls
输出视为一个文件并生成此输出:
SCRIPT:
#!/bin/bash
FILES=`ls "someDir/"`
for f in $FILES
do
echo "Processing file: $f"
done
OUTPUT:
Processing file: File1
File2
File3
...
我无法理解它。此外,我甚至不确定是ls
产生这种行为。
是什么导致了这种行为?为什么?
答案 0 :(得分:2)
请参阅Why you shouldn't parse the output of ls(1),而不是使用process-substitution来处理命令输出。
find
上述简单find
列出了所需目录中的所有文件(包括带空格/特殊字符的文件)。这里,stdin
命令的输出被送到while-loop
,由sort -z
解析。
要对文件进行有序排序,请在find
命令输出中添加#include <bsoncxx/builder/stream/document.hpp>
#include <bsoncxx/types.hpp>
#include <bsoncxx/json.hpp>
#include <mongocxx/instance.hpp>
#include <bsoncxx/json.hpp>
#include <mongocxx/client.hpp>
#include <mongocxx/stdx.hpp>
#include <mongocxx/uri.hpp>
struct Thing {
mongocxx::client client;
mongocxx::database db;
mongocxx::collection coll;
void open_connection(const char* host, const char* db_name, const char* coll_name) {
mongocxx::instance inst{};
mongocxx::uri uri(host);
client = mongocxx::client::client(uri);
db = client[db_name];
coll = db[coll_name];
}
};
int main()
{
Thing thing;
thing.open_connection("mongodb://localhost:27017", "test", "insert_test");
auto builder = bsoncxx::builder::stream::document{};
bsoncxx::document::value doc_value = builder << "i" << 1 << bsoncxx::builder::stream::finalize;
auto res = thing.coll.insert_one(doc_value.view()); //crashes
return 0;
}
管道。